Polish sharing: useInbox hook, cancelled guard, share cache, permanent doc errors
- Extract web-local useInbox hook (apps/web/src/hooks/use-inbox.ts) using
getOpake() singleton; bootstraps InboxKeeper exactly once across concurrent
mounts; wires into shared.lazy.tsx replacing inline subscription logic (#15/#18)
- Add per-effect-invocation cancelled flag to shared.lazy.tsx async batch
resolver, preventing setState on stale/unmounted invocations (#17)
- Cache getActiveFileManager().listShares() in ShareManagementDialog with a
30s TTL; invalidated on revoke so repeated dialog opens skip the round-trip (#12)
- Track permanent document errors (NotFound/InvalidRecord/Decryption/Serialization)
across a retry_pending_shares pass; subsequent pending shares for the same
broken document skip the PDS round-trip (#13)
- Rename ShareDialog local `handle` variable to `recipient`; resolved identity
renamed to `resolved` to eliminate the shadow (#16)