remove 1:1 relationship between IFuture & Thread.

Process.detach() spawns a new thread that waits for the subprocess but
we don't need that overhead if the Process ID is stored and passed to
Process.wait() when IFuture#value is called.

This does mean in a long running application a IFuture that never has #value
invoked won't have its status collected when it exits. However, I think that's
not the common case(why spawn a future if you never want the value?).

I think we should cater for the common case and make that as efficient as possible
and if the above case becomes a problem we can look at other solutions.