- Take the _asyncsock_mutex in AsyncClient destructor. This should
handle scenarios where a previously-valid client is destroyed by
another task while being examined by the asyncTcpSock task.
- Since the _asyncsock_mutex is released before being taken again by the
AsyncSocketBase destructor, examined objects may be still "half-destroyed"
(AsyncClient destructor terminated and _write_mutex invalid, but still
waiting for lock in AsyncSocketBase destructor). However, _socket may
now be guaranteed to remain valid if it was valid when the
_asyncsock_mutex was taken.