feat: fill the course catalog from whoever is signed in
Cedarville moved the course catalog behind single sign-on, so the anonymous crawl the server depended on no longer works and a fresh install had no way to get a timetable at all. The crawl now runs in the browser of whichever student opens a term first, on their own session, and is offered back to the shared cache so everybody after them reads it instead of crawling again. The paging itself did not change: it was already written against a single search method, so the same loop serves both the old anonymous client and the signed-in one. Accepting a crawl from a student is a different problem from fetching one, because the shared cache is read by everyone. Three guards decide whether an offer is trustworthy: the payload is validated field by field, only a crawl that reached its last page may replace a term, and no crawl may shrink a term by more than a fifth. Without the last one, a handful of well-formed sections could empty the catalog for every user. Also removes the agent tool server, which was the only thing launching the local capture listener; that now has its own start command. The course search request shape existed in two copies and the unused one had gone stale, declaring the wrong field for the data the timetable is built from. 💘 Generated with Crush Assisted-by: Crush:claude-opus-5