async utils for parallel operations in tests

More shenanigans!

This one lets you parallelize long-running operations, like (for example) resetting the region on three appliances simultaneously, which takes around 10 minutes per appliance.

This adds context manager behavior to the builtin multiprocessing Pool class, stashing all the pool setup and teardown boilerplate into the enter/exit methods.