Not sure, but the async version shouldn't be using the selector anymore. Essentially the async will use selectors internally to dispatch the async when data is ready.
However, your async version also looks like you're reusing the same socket for both local and remote clients. At least with TCP, each IP would need a separate `socket`. Looking at the docs, it seems you might be able to reuse the same socket with UDP, but you might not want to set `bindAddr`.