mtest: remove usage of executors
mtest: remove usage of executors

Rewrite the SingleTestRunner to use asyncio to manage subprocesses,
while still using subprocess.Popen to run them.  Concurrency is
managed with an asyncio Semaphore; for simplicity (since this is
a temporary state) we create a new thread for each test that is run
instead of having a pool.

This already provides the main advantage of asyncio, which is better
control on cancellation; with the current code, KeyboardInterrupt
was never handled by the thread executor so the code that tried to handle
it in SingleTestRunner only worked for non-parallel tests.  And
because executor futures cannot be cancelled, there was no way for
the user to kill a test that got stuck.  Instead, without executors
^C exits "meson test" immediately.  The next patch will improve things
even further, allowing a single test to be interrupted with ^C.

mesonbuild/meson,jpakkane/meson,jpakkane/meson,mesonbuild/meson,pexip/meson,QuLogic/meson,pexip/meson,jpakkane/meson,mesonbuild/meson,QuLogic/meson,pexip/meson,pexip/meson,pexip/meson,pexip/meson,pexip/meson,jpakkane/meson,QuLogic/meson,QuLogic/meson,mesonbuild/meson,mesonbuild/meson,jpakkane/meson,QuLogic/meson,mesonbuild/meson,QuLogic/meson,QuLogic/meson,mesonbuild/meson,mesonbuild/meson,pexip/meson,mesonbuild/meson,jpakkane/meson,jpakkane/meson,pexip/meson,QuLogic/meson,jpakkane/meson,pexip/meson,QuLogic/meson,mesonbuild/meson,jpakkane/meson