Refactors the existing background skill extractor into a layered memory
subsystem that GeminiClient can drive uniformly across interactive and
non-interactive sessions.
- Adds an internal `MemoryProvider` interface (not exported, not surfaced
via extensions) as a typing seam between the orchestrator and its
concrete implementation
- Refactors the existing skill-extraction logic into `DefaultMemoryProvider`,
the sole implementation of the seam
- Introduces `MemoryService` as a thin orchestrator that owns a
`DefaultMemoryProvider` and wraps every lifecycle call in try/catch so
a buggy provider can't crash a turn
- Moves MemoryService ownership into `GeminiClient` (private field exposed
via optional methods) so non-interactive entry points share the same
lifecycle as the interactive UI
- Keeps builtin memory extraction asynchronous on startup to avoid
blocking the first turn
- Adds unit tests for MemoryService, DefaultMemoryProvider, and the
GeminiClient integration
The whole subsystem remains gated behind the existing
`isMemoryManagerEnabled()` experimental flag.