rgw: beast frontend uses async SharedMutex for pause
the strategy for pause relied on stopping the io_context and waiting for
io_context.run() to return control to all of the worker threads. this
relies on the fact that process_request() is completely synchronous (so
considered a single unit of work in the io_context) - otherwise, pause
could complete in the middle of a call to process_request(), and destroy
the RGWRados instance while it's still in use
calling io_context.stop() to pause the worker threads also assumes that
no other work will be scheduled on these threads
to decouple pause from worker threads, handle_connection() now uses an
async shared mutex to synchronize with pause/unpause