Rewrite room management:

State change only on server response. Allow gathering a
room roster before the room is joined by a 110 status stanza.
Do not leave the old room until the new room has been joined.
Save code by white-listing commands for online and offline usage.
Add a /join command.
Escape/unescape room name internally.
userClear -> userRefresh:

Allow receiving a roster before we have joined the room.
The user list will then be visually replaced once the 110
is received.
Also, messageClear is no longer used.
Rewrite message output handling.

Store a list of all messages emitted in the session,
allowing the insertion of backdated (delayed) messages
into the log. Do not add such messages twice when the
room is rejoined in the same session.
Ignore /quits outside current room.

Specifically, ignore our own /quit from old rooms
after we have joined a new room.