- pagination: clamp per_page to [1,100] and page to >=1 in the parser,
guard the TotalPages division against per_page=0 (panic), and clamp the
current page to [1,totalPages]; preserves cursor (next-token) mode
- middleware: add panic-recovery as the outermost middleware so handler
panics return a 500 instead of crashing the process; re-panics
http.ErrAbortHandler to keep file serving intact
- index: bound the index page query (Limit:200) so it no longer drains
the entire courses table in 1000-row batches