Use an external process to kill forked checks that time out

This now uses an external process to monitor forked checks and ensure that they're killed when they time out.  This is because we've found that sleeping inside of a thread in the fork is unreliable -- the process just hangs.

@jjrussell / @deanxorr