More or less a standard queue, but allows obtaining a future<> for queue-empty conditions (for consumers) or queue-not-full conditions (for producers)