Split SbtChannel out of SbtClient 

This is mostly a code cleanup to separate concerns; it also allows us to make more assumptions in SbtClient because it becomes possible to use the raw channel if someone has custom needs.

Why not just use an AtomicBoolean so there's no synchronized?  

```scala
private val claimed = new java.util.concurrent.AtomicBoolean(false)
final def claim(): Unit = 
  if(!claimed.compareAndSet(true, false)) throw new ChannelInUseException();
```