Prototype API for MUC management

This implements the necessary methods to query joined rooms, join/leave
rooms and get/set the topic for a room.

It implements this for the test backend but still requires work
implementing it in the rest of the back-ends.
Expose majority of room management through MUCRoom class only
Create MUCRoom.invite(), deprecate invite_in_room()
Add room callbacks
Hook room callbacks up in the test backend
Fix PEP8 W391
Use set_topic() rather than attribute assignment

This seems like a cleaner API, making it more explicit that this will
directly modify the rooms topic on the server.
Reset list of known rooms on test-backend reset

This got broken because the variable `joined_rooms` was later changed to
just `rooms`.
Add bot commands to create, join, leave and destroy rooms
Use python 2 compatible use of str.split()
Don't make Backend.rooms be a property

Unfortunately, when it's a property, this breaks command injection for
plugins because the inspect.getmembers() call somehow ends up triggering
the NotImplementedError exception :(

This is not acceptable and the argument "but it should be implemented
for all backends anyway" doesn't fly because not all backends may
support multi-user chatrooms, so we still want to be able to raise an
exception there.
Use join_room when query_room is not yet implemented
Allow passing reason to MUCRoom.leave()

It's quite common (XMPP and IRC support it) to be able to specify a
reason for leaving a given room.
Add !room_invite and !room_occupants commands
Add test for !room_occupants
Add !room_topic command
MUC management implementation for XMPP backend
Better deprecation warning on Backend.join_room()
Trigger callback_room_{joined,left} in XMPP backend
xmpp: Raise RoomNotJoinedError on topic operations while not in room