- Added `joinChannel_imp(string channelName)` which performs the joining of a channel and returns a `Future`
- Added `joinChannel(string channelName)` which is a neat wrapper around the above
- `enumerateChannels(ulong offset, ubyte limit)` now handles incorrect replies by throwing a `ProtocolException` on wrong reply type
Client (unittests)
- Added a unit test for `joinChannel(string channelName)`
- Added authentication command support
- Added channel enumeration support
- Added some helper methods for the channel enumeration support
Client (unittests)
- Added unittests for the above
- `makeRequest(BaseMessage request, Queue responseQueue, bool releaseAfterUse = false)` now will only deregister the queue if requested
- `makeRequest(BaseMessage request)` now requests queuew deregistration
- Attack and start a `Sequential` provider to the `Executor` in constructor
- Added `stop()` method which stops the tristanable manager and the provider associated with the executor
Client (unit tests)
- Hoist result from future
- Stop client at end
- Removed while loop
- `nopRequest()` now registers a tristanable queue, then creates a delegate which sends the message and waits on said queue, we submit this delegate to the guillotine executor
- Added a constructor which consumes a river-based `Stream`
- Added a constructor which takes in an `Address` and opens a `Socket` to it, connects and then passes it wrapped in a river-based `SockStream` to the `Stream`-based cinstructor
- Added a constructor which takes in `(string domain, ushort port)`, which resolves the domain then passes said address to the `Address`-based constructor (ditto from here)