Fix race condition in ReplyWaiters.wake_all()

While we're iterating over the queues in ReplyWaiters.wake_all(), new
queues can be registered and we get:

  RuntimeError: dictionary changed size during iteration

Instead of using an iterator, take a snapshot list of message IDs and
operate on that.

We don't actually care about any new queues added after wake_all() is
called because the connection lock has already been dropped so one of
the other waiters must have picked it up.

We also don't need to worry about queues being removed - if we write to
a removed queue, that's not going to be a problem.

Change-Id: Ib572cbfd3a7346b76579f82b64aa85a03c1a4fb2