test_async: run gevent loop to completion in each test

LoopExit should actually be expected in all tests, as an indication that
all running greenlets have terminated. But rather than catching it
directly, the proper interface is gevent.run(). The body of each test
should also be spawned in a separate greenlet so that everything works
properly.

Change-Id: I68875226837c1087c1d7e77650a9ddfa58bd1da6