split read and write channels

+ ensure that read/write operations fail as expected
when called on a write/read channel
read and write by delegating to r/w bytebuffers