go_async.py:  Changed how functions get called...  Instead of being called directly by child processes they are wrapped via the `safe_call()` function which sets the default signal handler for the `SIGINT` signal before calling the wrapped function.  This prevents all sorts of garbage from being spit out to the terminal when you Ctrl-C a running gateone.py process if the `MultiprocessRunner()` hasn't shut itself down yet.
go_async.py:  Added a new method to `AsyncRunner()`:  `map()`.  It works similarly to the `map()` function included in `concurrent.futures` but with some special sauce to make it more flexible and expecially *more asynchronous* (take a look).
gateone.py:  Added a new function: `shutdown_async()`.  It just shuts down the `CPU_ASYNC` and `IO_ASYNC` asynchronous task runners.  It gets called when gateone.py exits via the @atexit.register decorator.
gateone.py:  Added a workaround for systems that don't support multiprocessing.  So if your (wacky) system doesn't have enough semaphores or something like that the `CPU_ASYNC` global will just fall back to using `ThreadedRunner()` (faking it).