Share one FileManager per context in @opake/react hooks
Every mutation that went through withFileManager used to build its own
FileManager via opake.workspace() or opake.cabinet(). For workspaces
that meant a fresh PDS getRecord round-trip on the keyring before each
delete / upload / rename / move — useDirectory and useDirectoryMetadata
had their own long-lived FileManager from the provider cache, but the
mutation layer bypassed it entirely.
Rewrite withFileManager to acquire from the FileManagerCache and
release when done. Concurrent acquires share one instance, so a burst
of mutations hits the cache once and disposes once. Hooks that
previously called useOpake() for this now call useFileManagerCache().
While here, factor the duplicated bootstrap guard out of useWorkspaces
and useInbox into a shared bootstrap-once helper. The new version keys
the in-flight promise on (Opake, label) via a WeakMap, so switching
accounts mid-bootstrap doesn't short-circuit on a stale guard from the
previous identity — which the old module-level `let bootstrapPromise`
quietly did.