Refactor ClientEvent and chat message handling

This refactor makes conversations contain a list of ConversationEvent
instances rather than just chat messages, which will allow other types
of events like conversation renames to be implemented.