rework FD to handle EAGAIN on send