Add ChannelFactory abstraction to support non-standard channels/selectors

The ChannelFactory interface allows for someone to plugin in an alternative channel and/or selector, this is useful in supporting alternative socket channels (e.g. see UDT https://github.com/barchart/barchart-udt).

[I have a version of this that uses subclasses instead of the factory interface, but i think this is cleaner]