backend/udp: If either tun or udp get read optimistically repeat

This optimization bypasses poll() under continuous activity like
bulk transfers.  In simple dd | ncat tests this change eliminated
practically all poll() calls during the transfer, substituting them
with EAGAIN read()/recvfrom() calls at half the original poll()
occurrences.

The ctl fd is intentionally starved by this change, and an upper
bound could be placed on how long we do so by adding a simple
counter to break the inner loop if necessary.
I feel this is a good direction. It does help with minimizing calling poll() but it also changes the fairness of servicing sockets. Old code could starve out fds[1] if fds[0] is constantly ready. This code will fairly ping-pong between the two sockets. At the same time, if both fds are busy, it's be better to allow some batching. If there're 10 packets ready, it's better to push them through as close together as possible as it'll help with like keeping caches hot, minimize waking up blocked threads, calling h/w doorbells, etc. This mechanism could also be used to avoid neglecting the ctl socket.