Add client_uri host-match check per atproto OAuth profile
The atproto OAuth profile
(<https://atproto.com/specs/oauth#client-metadata>) requires the
optional `client_uri` field, when declared, to share a hostname with
`client_id`: *"`client_uri` (string, optional): … must have the same
hostname as `client_id`."* The rule exists specifically to deter
metadata uploaded to an attacker-controlled origin from pointing
`client_uri` at an unrelated legitimate-looking domain.
Add the field to `RawMetadataDocument` and introduce
`Check::ClientUriHostMatchesClientId`. Semantics:
- `client_uri` absent → `Skipped` with reason
"`client_uri` not declared" (the field is optional).
- `client_uri` present and its URL's host equals the parsed
`client_id` host → `Pass`.
- `client_uri` present and its host differs → `SpecViolation` with a
diagnostic naming both hosts.
- `client_uri` present but not a valid URL → `SpecViolation`.
- `client_id` itself invalid → `Skipped`/blocked_by
`client_id_matches`.
New `client_uri_host_mismatch/` fixture + integration test covers
the failing path. All 334 tests pass; all 16 real-world atproto
OAuth clients still pass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>