An implementation of concurrent channels identical to
Control.Concurrent.Chan, except that the channel is
represented as a pair, one of which allows only read
operations, the other write operations.

This makes code easier to reason about (the types strictly
delegate read/write permission), suggests useful instances
(e.g. Functor and Contravariant are easily defined)
on the chan pairs, and simplifies the API.

Furthermore this allows messages sent to channels with no
readers to be trivially garbage-collected, without relying
on inlining optimizations.

We also provide a module that defines a class SplitChan
which defines the basic methods any pair of Chan types
should provide, allowing easy swapping of Chan
implementations.

To use standard Chans with these polymorphic functions,
import as follows: