Use blocking queues, don't sleep.

Here's a much faster version using GridBuffer
objects which block. This way we don't need to tune sleep values,
and we'll benefit from faster hardware.
Fixed control logic.

Not bug free, but control is now close to correct.