feat(oauth-client): complete metadata validation logic (Phase 4 Task 2)
Implements all 14 metadata validation checks specified in phase_04.md Task 2:
1. ClientIdMatches: validates client_id field matches discovery facts
2. ApplicationTypePresent: requires application_type field to be present
3. ApplicationTypeKnown: validates application_type is "web" or "native"
4. ResponseTypesIsCode: validates response_types equals ["code"]
5. GrantTypesIncludesAuthorizationCode: validates grant_types includes authorization_code
6. DpopBoundTrue: validates dpop_bound_access_tokens is true
7. RedirectUrisPresent: validates redirect_uris is present and non-empty
8. RedirectUrisShape: validates each redirect URI matches client kind requirements
9. TokenEndpointAuthMethodValid: validates auth method matches client kind
10. ConfidentialRequiresJwks: validates WebConfidential clients have exactly one of jwks/jwks_uri
11. PublicForbidsJwks: validates WebPublic/Native clients don't have jwks or jwks_uri
12. ScopePresent: validates scope field is present
13. ScopeGrammarValid: validates scope parses according to atproto permission grammar
14. ScopeIncludesAtproto: validates scope includes the atproto token
Key implementation details:
- Determines ClientKind (WebConfidential, WebPublic, Native, Loopback) based on application_type and token_endpoint_auth_method
- Builds MetadataFacts when sufficient checks pass to populate required fields
- Emits blocked_by relationships when prerequisite checks fail
- Uses derive-based diagnostic types for all new errors
- Hoisted mid-file imports to module top per CLAUDE.md conventions
- All checks emit in declaration order for snapshot stability
Supersedes placeholder in commit 61d2c1b.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>