Owns the refresh cycles. The refresh_job row is the source of truth: a cycle is its
last_trigger_time, and both transitions are the post-collect of a barrier (RefreshStart moves
the job to Refreshing, FinishRefresh back to Idle). A recovery kills every cycle of the
databases it re-initializes and moves their rows back to Idle before those databases accept
commands again (abandon_cycles), so nothing has to infer an abandoned cycle afterwards. The
in-memory tracker of a cycle is installed by the same barrier that started it, before the row
moves.