Make cmdJOIN not the most broken thing ever

The problem with its implementation was the split of channels and keys going
way out of sync. Joining multiple channels in a single command is hard to do
this way because it's impossible to tell what key to use with what channel.
This is solved by removing the functionality to join multiple channels
altogether. It's not that hard to send multiple commands anyway.
Remove user cleanup in favor of a weakref dictionary
Handle the PRIVMSG command
Add some empty lines to keep the code readable
Split out numerics and commands before parsing them
Handle the NOTICE command
Shorten desync warning messages
Handle the KICK command
Delete the channel reference when the bot leaves or is kicked
Handle the INVITE command
Implement the INVITE, KICK, PART and TOPIC commands
Parse the MODE command and implement sending it