Fix IO.select to fit new IO model better.
Hook up IO.popen to popen subsystem.
Implement Process.spawn atop new popen backend.
Fix up popen/spawn logic to make no modifications in parent.

The MRI process-launching logic went like this:

* Process all the incoming arguments and options
* Lock down the VM and apply those options in the parent
* Save all modified process-level data from parent
* Do the fork/exec/spawn dance for the child
* Restore all process-level data in the parent

This is obviously not thread-safe, since we're making global
changes to the parent process. We can only support the features
that posix_spawn supports.

The new process-management logic in JRuby goes like this:

* Process all the incoming arguments and options
* Prepare posix_spawn flags based on those options
* Raise errors or warn for unsupported features of Ruby's
  Process.spawn
* Spawn the child with posix_spawn

This means we can't support a few of the more esoteric features,
like changing rlimits or setting uid, but it does avoid us having
to ship native code to do the fork/exec the same way as MRI.