Zoekt: Support offset-based pagination in coordinating node search API
## Background
Currently Rails requests up to 5,000 files from the Zoekt coordinating node and paginates client-side — iterating through the full JSON response to extract the requested page. This means page 1 and page 50 both receive the same oversized payload.
The coordinating node already collects, deduplicates, and sorts results by score. It should also handle pagination so that Rails receives only the files it needs.
## Proposal
Add `offset` support to the coordinating node's search API alongside the existing `max_file_match_results` (which acts as `limit`).
**Go side (coordinating node):**
- Add an `offset` field to `SearchRequest`
- After the existing post-sort trim, skip the first `offset` files before applying `max_file_match_results` as the limit
- Stats fields (`TotalFileMatchCount`, `TotalLineMatchCount`) remain unaffected — they already reflect the full result set
**Rails side:**
- For pages 1-10 (the common case): `offset=0, limit=10*per_page` (200 files) — preserves current caching behavior, Rails caches individual pages from the batch
- For pages 11+: `offset=(page-1)*per_page, limit=per_page` (20 files) — single page, no batch
- `Search::Zoekt::Params` computes these based on the requested page
- `Search::Zoekt::SearchRequest` includes `offset` in the payload
**Example request flow:**
```
Page 1: offset=0, limit=200 → 200 files returned (cached as pages 1-10)
Page 5: cache hit from page 1 request
Page 11: offset=200, limit=20 → 20 files returned
Page 50: offset=980, limit=20 → 20 files returned
```
The coordinating node still collects and ranks across the full 5,000 window — only the returned slice changes.
### Why batch the first 10 pages?
The existing `Search::Zoekt::Cache` (`MAX_PAGES = 10`) pre-fetches 10 pages of results and caches them individually in Redis. Most users browse within the first few pages, so this avoids repeated coordinating node requests for sequential page navigation. For pages 11+, the probability of sequential browsing drops significantly, so requesting a single page is sufficient.
### Rollout
This change should be rolled out behind a feature flag (e.g., `zoekt_offset_pagination`) to allow gradual rollout and quick rollback.
issue