Expose opake.did on the SDK, reframe the WASM accessor
The `getDid` WASM export had a stale docstring — it justified the
binding with "self-event filtering in the SSE consumer," a mechanism
removed when tree idempotency took over. Meanwhile every consumer
that renders a "signed in as..." UI, keys a local cache by account,
or discriminates between identities had no ergonomic way to ask the
SDK who this Opake represents: `listAccounts().find(a => a.isDefault)`
is clumsy and wrong when the caller passed an explicit DID to init;
reaching into `storage.loadConfig()` leaks the abstraction.
The capability is legitimate — the DID of an Opake instance is
invariant for its lifetime, the WASM side already has a cheap sync
accessor, and exposing it is universally useful. The dead
justification was the smell, not the method.
- WASM: rewrite `getDid`'s docstring around its actual purpose (cheap
sync identity accessor, called once by the SDK during init).
- SDK: add a `readonly did: string` field on `Opake`, populated in
`init()` via a single `ctx.getDid()` call (guaranteed lock-free
since no other code holds the mutex at that point). Surfaces on
`opake.did` — invariant, no round-trip, ergonomic for UI and
account-keyed caches.
- Update the class-level JSDoc with a `console.log("signed in as...")`
example so the property is discoverable.