Optimize 'fold', document blocking caveat of 'duplicate', and fix race in 'receive'

Please see the commit messages.  In particular, `duplicate` has the same [blocking caveat][4154] that bit [isEmptyChan] and [unGetChan].

Differences between `unsafeFold` and `fold`:

 * `unsafeFold` is *less* efficient than `fold`; see commit 51871dd

 * `unsafeFold` can be used to make multiple threads fight over a single channel, useful for sharing jobs among threads.

 * `unsafeFold` breaks referential transparency under base < 4.6 due to `unsafeInterleaveIO` duplicating the computation; see [GHC ticket 5859][5859].  Regular `fold` does not have this problem because its interleaved computation does not leave side effects in its wake.

 [4154]: http://hackage.haskell.org/trac/ghc/ticket/4154
 [5859]: http://hackage.haskell.org/trac/ghc/ticket/5859
 [isEmptyChan]: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent-Chan.html#v:isEmptyChan
 [unGetChan]: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent-Chan.html#v:unGetChan