Detect and kill runaway builds and builds that take too long.

Initially wait 20 minutes before considering a build to be runaway. If no
data comes from stdout of that build then it is killed.

Also add a 24 hours max timeout for a command.

This adds a generalized nohang() command that be used for other purposes as
well. A return status of 0 means success, 1 means the command returned
non-zero, 2 means the stdout timeout was hit and 3 means the command
timed out the overall max limit.

nohang() uses a subshell to run the actual command and then loops and
periodically checks if the command has timed out by stating the log and checking
a timer. The same IPC pipe method is used as parallel building to immediately
alert the watcher that the process has completed.