fix(oauth-client): address Phase 4 code review feedback
- C1: Fix check emission order — ScopeIncludesAtproto now emits before ScopeGrammarValid
- C2: Add diagnostic types for all SpecViolations with stable codes
- C3: Resolve dead HTTP block for native redirect URIs — explicitly reject HTTP
- I1: Remove _metadata_facts landmine binding, add TODO for Phase 5
- I2: Convert RawDocumentDeserializationError to manual impl (compat with NamedSource)
- I3: Add RedirectSchemeReverseDomainMismatchDiagnostic type
- I4: Make run() synchronous (drop async, update caller)
- I5: Rename test scope_rejects_empty_string to scope_accepts_empty_string_as_empty_set
- M1: Remove Serialize from RawMetadataDocument derive
- M2: Use raw_source_name parameter instead of hardcoding 'metadata document'
- M3: Simplify parsed_id.as_str() instead of unwrap().as_str()
- M4: Trailing periods on all new comments
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>