Implement support for replies

Firstly, pass the reply_q and msg_id when constructing RabbitIncomingMessage
and implement RabbitIncomingMessage.reply().

Secondly, in RabbitDriver.listen(), set up the reply queue and wait for a
reply if one is needed.

The real complexity of all this is where you have multiple threads waiting
for a reply, you need a thread to read the messages and pass them to the
appropriate waiting thread based on message ID. Previously, we spawned a
new greenthread to do this but, rather than add a dependency on green threads,
we just have the first waiting thread do that job.

Change-Id: I800ca2a7e32abd8e1df093d0f24b8b7c8618910d