[WIP] Refactor to use dispatch_io for tasks, and wait for EOF

Hopefully resolves #151, #139, and #135.

/cc @joshaber @keithduncan
> NSTask is pretty clear that setting a custom handle for standardOutput and standardError could cause problems, because the correct ends of the pipe won't always be closed.

I couldn’t find any docs on that, however as we’re giving the child process the write end and keeping the read end ourself, the worst that could happen is the child also inherits a handle to the read end but this won’t prevent us receiving EOF on the read end when the child process `close(2)` the write end or exits causing the write stream structure to be destroyed in the kernel (assuming the write descriptor in the child was the last reference).

While researching this I found the [`POSIX_SPAWN_CLOEXEC_DEFAULT `](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/posix_spawnattr_setflags.3.html#//apple_ref/doc/man/3/posix_spawnattr_setflags) extension which looks very useful.

The header and docs do suggest you can pass your own `NSFileHandle` `// standard I/O channels; could be either an NSFileHandle or an NSPipe`