I just spent some time tearing my hair out getting trial and ThreadedSelectReactor to cooperate.
Another possible solution to the trial/reactor impedance mismatch you commented on would be for trial spawn off a process for each test. By definition, that process would get its own reactor and could not taint any other tests. The test rig process could happily use Deferred semantics, while presenting a synchronous interface to trial.
This would also be easier to distribute IMO, because if IPC is already involved in communication between trial runner and tests, making that IPC go to another machine is easier.
I realize the cost of spawning processes, but I honestly think that it's easier to change unittest to fork, run a test on a separate reactor, and IPC the test results back to the parent, than it is to take one of the other three approaches, because of the API changes they would require. (Not that said API changes would be bad, but I don't think that the distributed runner should have to wait for them.)
"Computers! All they ever think of is hex!"