[Perf inspired by#71] reduce needless work when flushing and encountering empty queues

* don’t both allocating a new intermediate queue if it is empty
* don’t bother trying to invoke all the callbacks for a clearly empty queue
* don’t both trying to flush the empty queue
* don’t bother trying to see if the empty queue scheduled something on a previous queue

instead

- check if we need to flush the current queue
 - if it needs to be flushed: flush, then return to the first queue and check again.
 - if not, try the next queue