Add a CPU-only, English-first OCR engine (the `ocrs` crate on the `rten`
runtime) as an alternative to the local-LLM "vision" backend, which ran
too slowly on the target Raspberry Pi 5.
- `ANALYSIS_BACKEND` (default `ocr`) selects the engine; `vision` keeps the
existing LLM path. Deploy-time, env-only — not admin-tunable.
- `analysis::ocr` adds an `OcrEngine` trait (testable seam), the `OcrsEngine`
impl (models loaded once, inference on the blocking pool), and an
`OcrAnalyzeDispatcher` that plugs into the existing `AnalyzeDispatcher`
seam and reuses `persist_analysis`, so OCR text lands in `page_ocr_text`
and the `search_doc` tsvector exactly as the vision path produces them.
- The backend image bakes the two `.rten` models into /models, where
`OCRS_DETECTION_MODEL` / `OCRS_RECOGNITION_MODEL` default.
Because `/v1/me/page-search` ranks on `search_doc`, OCR text search works
the moment pages are processed. Auto-tagging, scene description and NSFW
flags remain the vision backend's job (deferred).
Bumps to 0.90.0 (minor) in both manifests.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>