Add support for Python 3.8

`ChildWatcher.add_child_handler` needs to be called from a main loop
and is dispatched through that main loop.

To be able to properly dispatched the ChildWatcher handlers,
`Scheduler._terminate_jobs_real` had to be made loop friendly by
yielding between termination and kill so that it knows which process
have been terminated.

Since `Scheduler._terminate_jobs_real` now yields instead of blocking,
we need to avoid calling it multiple times from the main loop.
6 files changed