Part of #391
Problem
SemanticMemory<P: LlmProvider> only uses P::embed(), but carries the full LlmProvider generic through Agent → MemoryState. This causes monomorphization overhead.
File: crates/zeph-memory/src/semantic.rs line 58
Proposed Solution
Accept Arc<dyn EmbedProvider> (narrower trait) or EmbedFn closure instead of full LlmProvider.
Priority: P3 | Effort: Large