relay: start using channel and user collections

* instead of storing everything in UserChannelInterface, store channels and users in
  sets of data inside each other
* this leads to a much simplified system of addition and removal
* WARNING: this is still highly experimental
relay: add a load of documentation in user channel interface
relay: refactor bits of code and cleanup
relay: fix invalid nick events crashing connection

* fixes tilal6991/HoloIRC#72
relay: add ability to strip colours from messages

* stripping them for now - we'll see if I ever get round to writing the parsing code
xda-one: minor refactoring
relay: refactor main classes into interface and implementation

* make the old names the interface and prefix the implementation with "Relay" - minimum breakage
* TODO - the Relay classes eventually should not visible outside the package
* use Relay classes exclusively internally though
relay: more refactoring and fixing of interfaces
relay: add a validity parameter to conversation

* a conversation is invalid if the data it contains is no longer reliable
* in implementations this is when:
  - for a server - currently never
  - for a channel - when the user parts/is kicked from the channel
  - for a query - when the query is closed