Remove timeout events when subprocesses exit

This also modularizes code for spawning subprocesses.

You can now send a SIGINT/SIGTERM and censorscope will cleanup immediately if all children have exited.