improve patience for slow Hub in client tests

adds a first step in `_wait_for_idle`, where it waits for all tasks to arrive before waiting for no tasks to be running.  On a super slow machine, it was possible for `_wait_for_idle` to return prematurely, before tasks had even started.

ought to close #2807