Report exceptions while running the job to the client.

Don't catch any exceptions while running the job; instead, report
them back to the client (via a catch-all exception handler in
StartJobWorker).

If the worker raises an exception, unlock the node monitor, in case
the worker didn't get to the point where it would be unlocked.

This change has the side effect that if the gearman server disconnects
while the job is running, the worker should return from watching the
job run (as soon as it notices, currently up to 5 seconds).  This is
helpful in that it will be available to register with gearman again,
including sending CAN_DO packets.  But the node monitor will still
prevent it from scheduling a new job while the one it started earlier
is still running.

Change-Id: Ie01ef0f9e706d81452b189099e36242ab9967950
Don't catch InterruptedException in the node monitor.

It is probably because someone is trying to shut down this thread.
Instead, allow it to propogate up where existing code around
sendGrabJob handles it correctly.

Change-Id: Ia51bdd7e81262e10386b9253dcb2cfb4294f3097
Use AbstractProject instead of Project in function factory.

Fixes an illegal argument exception.

Change-Id: I9a1fde359e043b7cdf2fb1e635ac65a6196dc0c0
Send final packet immediately.

Rather than waiting for it to be sent on the next pass through the
loop.

Change-Id: If77bf1e0be6946d6a0b5db33cec5d1caf98cd058