Implement process bindings to libuv

Closes #6436
Remove code pending for a #6436 fix
Close all stdio on finish()

This prevents deadlocking ourselves in situations like:

* The process is waiting for input
* The process is blocked in writing output, but we're never going to read it

Once 'finish()' is called, it's indicated that the output is no longer desired.
For this reason, we can close the outputs (if they still exist). It's still the
case that `finish_with_output` will consume all output of the process.