Worker spends too much time outside of websocket read code
This is related to #1418 and associated issues. The main event loop in the worker hinges about this `async for` that consumes inbound websocket messages: ```py async for msg in ws: # pragma: no branch await self._process_message(msg, client) ``` If a `work_request_available` message is received, this will in turn await `self._request_and_execute_work_request()`, which will stay out of the websocket receive code until the work request has finished running. While trying to figure out observed websocket disconnects that neither the server nor the worker were supposed to trigger, we tried wrapping the `_request_and_execute_work_request` in a `create_task` and we stopped observing the disconnects. It looks like a good idea to fork processing the work request to a task and resume receiving messages via websocket as soon as possible. Multiple `work_request_available` notifications would still be caught by `_task_lock`
issue