Use strings as channel identifiers instead of numbers

This is done for three reasons:

 * Much much more flexible going forward, since this is an integral
   part of our protocol, it can never be changed.
 * We can allow routing multiple WebSockets to one agent, without
   trying to coordinate the channel number space of those WebSockets.
   This is not implemented in this patch.
 * We can implement internal channels that don't get routed to a
   WebSocket (necessary for implementing resource loading).

This is an alternative to the signed channel number patch that was
floating around.

Closes #546