make channel class more subclassable
allow dependency injection for channels
make channel an abstract type
split drivers and channels into composable roles