Added partial indexes and rewrote the meetings cleanup query so the background
worker stays fully index-backed as the `meetings` table grows:
- `idx_meetings_recurrence_eff_end` on `GREATEST(end_time, recurrence_until)`
  for bounded recurring meetings (covers the recurring branches of the list and
  cleanup queries).
- `idx_meetings_end_time_nonrecurring` on `end_time` for non-recurring meetings,
  so cleanup can find expired non-recurring meetings without scanning
  not-yet-expired recurring rows whose original slot is long past.
`getOldMeetingsImpl` now issues one bounded, index-backed query per meeting kind
and merges the two batches.
