We now distinguish between status, which is maintained by the server,
and data, which is provided by the client. In addition to client data,
we now support group data.
We now inform clients of the status of a group (locked, etc.). Also
cleans up the handling of administrative messages, which solves the
issue of receiving "user" before "joined".
The server now maintains a set of statuses for each user that are not
interpreted by the server but communicated to the other members of the
group using 'user' messages.
We used to signal connection replacement by reusing the same connection
id. This turned out to be racy, as we couldn't reliably discard old
answers after a connection id was refused.
We now use a new id for every new connection, and explicitly signal
stream replacement in the offer message. This requires maintaining a
local id on the client side.
Split the id field into id and source, where source indicates the sender
of the message and id the entity being sent. Remove the label request,
just use the offerer's username. Maintain the username within the
ServerConnection, this removes a parameter from some methods.