Never call exit() -- make sure everything is destroyed cleanly

Hi Ravi,

Here is a cleanup that makes sure we never call `exit()` (which is kind of abrupt and leaves it to the operating system to clean up after us).

Instead now we throw a `ChildProcess::Exit` exception. The exception propagates all the way back to `main()`, making sure that every object gets properly destroyed before we `return` from `main()`.

-Keith