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.