Drop the dead Option wrapping on WASM handles
`WasmOpakeHandle::inner: Rc<Mutex<Option<WasmOpake>>>` and
`WasmFileManagerHandle::context: Option<FileContext>` — neither was
ever set to `None` anywhere in the crate. The Option wrappers and the
defensive "handle already consumed" plumbing were leftover from an
earlier design where `.cabinet()` and `.workspace()` consumed the
parent. Both methods are non-consuming now, and `wipeState()` drains
the keepers rather than the Opake itself, so no code path flipped the
Option — every `is_none()` branch and every
`.as_ref().ok_or_else(...)` was defending an unreachable state.
Collapsing:
- Fields: `Rc<Mutex<Option<WasmOpake>>>` → `Rc<Mutex<WasmOpake>>`;
`context: Option<FileContext>` → `context: FileContext`.
- `OpakeGuard`: was a newtype over `MutexGuard<'_, Option<WasmOpake>>`
with hand-rolled `Deref`/`DerefMut` that unwrapped on every access.
Now a type alias over `MutexGuard<'_, WasmOpake>` — the plain
`MutexGuard` already derefs correctly.
- Seven different error strings gone: "Opake context already consumed",
"already consumed", "already finished", "FileManager already
finished", "Opake not available", and the `FileManager context not
available` branches. They were all defending against None states
that can't occur.
- `setIndexerUrl` loses its `Result` — the lock acquisition can't
fail in single-threaded WASM; a `Promise<void>` JS signature is
preserved.
Legitimate error strings stay: the `try_lock()` "Opake is busy" and
"Opake is busy — an operation is in progress" paths signal real
mutex contention, not impossible states. Identity-missing branches
(`no identity`, `identity has no signing key`) stay too — those are
real user-facing conditions on a freshly-paired device.
Net: -130 / +53 lines. Every access path is simpler, and the API
surface is honest about what can and can't fail.