Add interactive checks for `state` presence and `nonce` absence in PAR
The atproto OAuth profile
(<https://atproto.com/specs/oauth#authorization-request-fields>)
makes two rules about the PAR request body that the tester wasn't
observing:
- *"The `state` parameter in client authorization requests is
mandatory."* (Elevated from RFC 6749 §4.1.1's RECOMMENDED.)
- *"The `nonce` value, used in many other OAuth profiles, should not
be included."* (Atproto explicitly forbids the OIDC-style nonce.)
Add two interactive-stage checks alongside `ClientUsedPkceS256` and
`ClientIncludedDpop`:
- `ClientIncludedState`: `state=…` must appear in the PAR
body. Missing → SpecViolation.
- `ClientOmittedNonce`: `nonce=…` must NOT appear in the PAR body.
Present → SpecViolation.
Both inspect the request log via a new `par_body_has_form_key`
helper (simple key-presence test; we don't need full form-decoding
here). The blocked_by paths, PAR-failure early-exits, and the
WaitForExternalClient placeholder all emit the two new variants so
the check inventory stays consistent.
The default `DeterministicRpFactory` already sends `state` and
doesn't send `nonce`, so the happy-path snapshots show both new
checks as `Pass`.
All 334 tests pass; all 16 real-world atproto OAuth clients still
pass statically.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>