A single-producer, single-consumer queue. Create one with New(),
and send with Tx.Send(). Tx and Rx are each not safe for use by
multiple goroutines, but two separate goroutines can use Tx and
Rx respectively.
Receive a message from the queue. Blocks if the queue is empty.
If the context ends before the receive happens, this returns
ctx.Err(). If Close is called on the corresponding Tx, this
returns io.EOF