TemporaryJobs: monitor jobs while running tests

Fail the test if a job fails during the test run. We do this by running
the actual test on a separate thread, while the main thread polls for
job status, throwing an AssertionError if they've failed.