Move duplicated transmit start code into a single function
Avoid queue unlock followed by relock when the enable interrupt race is lost

This already happens infrequently, and the hold time is still bounded since
we defer to a taskqueue after a few tries.
Check for a full virtqueue in the multiqueue transmit path

With most hosts, we'll negotiate indirect descriptors, so all we
need is one available descriptor to transmit a frame.