Make RCU more efficient in UDP DNS threads

Before this, we were taking the naive-but-easy approach
of simply going offline before blocking on a network
receive call indefinitely and going back online when it
returned.  Under very high traffic loads, this can really
spam the rcu_online()/rcu_offline() code.

Now we normally stay online and use rcu_quiescent_state()
before blocking on network receive with a relatively-short
timeout (~47ms).  If we actually expire the timeout, we flip
back to rcu_offline() mode with an infinite net timeout,
basically pausing the thread until another packet arrives.
When it does, we flip back to rcu_online() and quiescence
calls with short timeouts again.

A socket/thread which maintains a traffic rate in excess of
~20pps will basically always stay in rcu_online() and use
per-packet rcu_quiescent_state() calls.

I haven't done any benchmarking on this at all yet, but I'm
pretty sure it's a net win.

This new mechanism can, in the worst case, delay updaters
(e.g. geoip and zonefile updaters) in rcu_synchronize() for
up to ~50ms while they await the right to delete the
previous copy of the data, but that should be a non-issue
in practice.

Note that liburcu 0.8 significantly improved the efficiency
of rcu_quiescent_state() for QSBR over previous versions,
which plays well with this change.  0.8 or higher is
recommended if you care about these things.