feat: #3594165 pdv_client: encrypt stored vault handles at rest with an optional key
A consumer site keeps each linked user's opaque vault handle in users.data. The handle is useless to a remote attacker without the OAuth secret, but on the consumer site that token is present, so a database read yields replayable handles. Since every vault read is handle-addressed and handles are only minted through the owner's consent, the handle store is effectively a second factor alongside the token.
Add an optional per-connection encryption Key (mirroring the client-secret key) and have HandleStore AEAD-encrypt handles at rest under a key derived from it. With the key held outside the database, a database dump alone yields a short-lived token but no usable handles.
- Self-contained crypto (libsodium XChaCha20-Poly1305); no dependency on the main pdv module, since pdv_client runs on a site with no vault of its own.
- Per-connection key via HKDF-SHA256, domain-separated by connection id; the AAD binds each ciphertext to its (connection, uid) so a row cannot be moved.
- Opt-in: with no key configured the handle is stored as-is. Fail-closed on write (a configured but unreadable key throws rather than storing plaintext); on read, an undecryptable row is treated as not linked so the user re-consents.
- calculateDependencies() now iterates both referenced keys (no duplication).
Closes #3594165