Pipes data from the Tap to the Sink through all the commands named, in
the given working directory.

Be careful! All IO is at the byte level: this means that piping even a
String such as "foo" will result in the raw UTF-32 moving: the bytes (in
my case; I believe this is implementation-dependent) in question are not the
ASCII [102, 111, 111] but rather [102, 0, 0, 0, 111, 0, 0, 0, 111, 0, 0,
0].

Note to Windows users: since hGetBufNonBlocking doesn't work on Windows
(it blocks despite its name, see
http://hackage.haskell.org/trac/ghc/ticket/806), this pipeline uses a
non-constant amount of space. The amount used is linear in the amount of
data used at any point in the pipeline. So if you want to pipe 20 gibioctets
of data to a program, you better make sure you have at least said amount of
memory available. (In fact, ByteStrings are used, and their documentation
suggests that you might want twice that, just in case.)

In addition, the Tap and Sink classes are meant for the POSIX code:
having to move data through the PtrWord8 types, bufferSize bytes at a
time, results in extra complexity.

If you want to do something about the above, ideally fix the GHC ticket
(probably nontrivial) and let me know so that I can activate the better code
for Windows as well. Alternatively, feel free to code an implementation of
this which works on Windows.

A helper function which converts a [Word8] to a String by mapping
chr over the octets.

In most cases, when you wish to pipe data to a String, you do not want to
interpret the results as the raw byte pattern of Chars, so you use
[Word8] as the Sink type. This function handles the common case of
ASCII data simply—if you're dealing with non-ASCII data you probably need
to handle the results in a different way.