Add optional Typesense search backend
Free-text search (search3/search2/Jellyfin ?searchTerm=) now routes
through Typesense when [typesense] is present in smolsonic.toml,
otherwise keeps using the existing SQLite FTS5 index. Scanner and
watcher mirror inserts/updates/deletes into Typesense; a fresh node
self-heals via a bulk reindex from SQLite on startup. Any Typesense
error transparently falls back to FTS5 so search stays working.