Open storage for identity and atomically load cached context.
Set the persisted cache key (called at login).
Get the currently set cache key, or null.
Persist the CryptoKey to IndexedDB for warm return after browser restart.
Load a previously persisted CryptoKey from IndexedDB.
Closes the IDB connection. Caller-owned lifecycle (R5): close() also drops the in-memory cache key and the open identity binding, so every further operation throws "Storage not opened" until the storage is reopened via open()/openAndLoad() and the cache key is set again. open() with a different identityId closes the previous connection automatically; same-identity open() after close() simply opens a fresh connection.