fix(identity-wallet): address PLC key management claim flow PR review feedback
## CRITICAL ISSUES FIXED
### 1. sign_and_verify_claim missing DID validation
- Added defense-in-depth check comparing caller's DID to ClaimState.did
- Prevents unauthorized access to claims
### 2. start_pds_auth missing pds_url validation
- Added validation that pds_url matches ClaimState.pds_url
- Prevents authentication with wrong PDS endpoint
### 3. AC/ticket references removed from source code
- Removed 17 occurrences of AC4.x references from test comments
- Replaced with descriptive text per CLAUDE.md policy
## IMPORTANT ISSUES FIXED
### 4. device_key_is_root error handling
- Added tracing::error\! logging at error branches
- Logs failures in list_identities and get_or_create_device_key
### 5. Silently discarded results when ClaimState cleared
- start_pds_auth now returns Unauthorized if ClaimState becomes None during store
- sign_and_verify_claim now returns Unauthorized if ClaimState becomes None during store
### 6. Token exchange error message details
- Included HTTP error body in fallthrough error message
- Changed from generic 'token exchange failed' to 'token exchange returned non-success response: {body}'
### 7. Token detection string matching documentation
- Added comment documenting the fragile string matching for use_dpop_nonce detection
- Notes that server error format changes will cause silent detection failure
### 8. ServiceChange.change_type now uses enum
- Created ChangeType enum with Added, Removed, Modified variants
- Updated ServiceChange to use ChangeType instead of String
- Serializes as camelCase per serde(rename_all = "camelCase")
### 9. Signed operation now uses serde_json::Value
- Changed VerifiedClaimOp.signed_op from String to serde_json::Value
- Changed ClaimState.verified_signed_op from Option<String> to Option<serde_json::Value>
- Eliminated unnecessary serialization/deserialization round-trips
- Updated both Rust and TypeScript types
### 13. OpDiff.prev_cid now uses Option<String>
- Changed from String with unwrap_or_default() to Option<String>
- Correctly represents absence of prior operation
- Updated TypeScript type to string | null
### 14. Error body handling in pds_client.rs
- Replaced 5 occurrences of unwrap_or_default() with unwrap_or_else
- Provides informative fallback '(response body unreadable)' on read errors
### 16. submit_claim_impl documentation
- Updated doc comment to clarify caller is responsible for clearing ClaimState
- Fixed reference to 'verify_claim' -> 'sign_and_verify_claim'
## SUGGESTIONS IMPLEMENTED
### 10. TypeScript claim flow JSDoc comments
- Added comprehensive JSDoc comments to all claim types
- Added detailed comments to claim command wrappers
- Added ChangeType union type definition
### 11. Logging added to claim commands
- Added tracing::info\! at entry point for all 5 claim commands
- Added tracing::warn\! for critical authorization failures
## VERIFICATION
- cargo check -p identity-wallet: PASS
- cargo fmt -p identity-wallet: PASS
- cargo clippy -p identity-wallet -- -D warnings: PASS
- TypeScript type check: PASS
All changes maintain backward compatibility with existing interfaces while
improving error handling, logging, documentation, and type safety.