add own file descriptor stream classes rather than using istream and ostream, because frustratingly there is no way to construct an istream or ostream for extra descriptors (even though all the iostreams implementations are doing that under the hood), and we need to do that to pass multiple pipes to a process.  surprisingly, this is also ~15% faster with OS X's libraries (have used a template header class so it can be largely inlined).