As a curiosity, a trivial implementation of a channel is benchmarked.

SillyChannel is no good for inter-thread messaging, but it can pass the no-contention message-passing test in about 35% of the time Buffered1Chan can.
This says that nearly ⅔ of the time spent in a no-contention message-passing event is spent on synchronization overhead.

A SillyChannel still takes twice as long on that test as the feature-complete buffered channel does in go.
More protocol cleanup

ChannelType.take() renamed to get(). Much better name.