Higher-level functions to simplify waiting for multiple concurrent async operations to finish