Improve cached frame bookkeeping

Instead of keeping a std::queue<amqp_frame_t> for each open channel, use
one std::vector<amqp_frame_t>. This should improve performance due to
cache locality, it will also help in the (upcoming) situation in which
we need to know the order of amqp_frame_t objects on a connection-wide
basis.
Improve the way channel bookkeeping is done.

Keep track of channels via a direct-mapped array of channel states
Add: BasicConsumeMessage from multiple consumers

Add BasicConsumeMessage() overloads to wait for messages from multiple
consumers, or from all the consumers defined on the Channel object.