Thread-safe string interner with bounded memory via LRU eviction.
Uses LruCache<Arc, Arc> where key and value are the same Arc,
enabling O(1) lookup via Borrow trait while preserving LRU semantics.
Upper bound on how many documents a limit == 0 (“no limit”) search is
allowed to materialize. Each SearchHit carries the full message
content string (roughly 80 KB p99 in real corpora), so an unlimited
search on a ~500k-row user history can easily allocate tens of
gigabytes of heap AND drive sustained multi-GB/s reads off the Tantivy
.store file and SQLite rows, crushing the whole machine.