Run starts immediately and repeats without waiting while an iteration finds
more work and succeeds. Empty or failed iterations wait for IdleInterval.
Each iteration has its own deadline; OnError decides how to report failures,
including those returned during caller cancellation.