Unbounded async-iterable append-only log with per-iterator cursors.
Direct port of libs/sdk/src/client/stream/multi-cursor-buffer.ts. Each
async for loop gets its own cursor starting at position 0, so late
consumers still see all previously buffered items. Lifetime is bounded by
the owning projection / handle; there is no eviction policy.