Splitting DataQueue into a base queue and a flow-control-aware queue.

We're finding DataQueue quite useful on its own, decoupled from any transports; this change separates the flow-control logic in `DataQueue.read()` into a new subclass `FlowControlDataQueue`.