Two rings: one in absolute time order; we expire from the tail and add (new)
or copy (retransmit) to the head. Copying is only done if we keep the ID.

The other is a hash table based on RADIUS ID. When we get an answer, we
look up the request based on the ID + dest port of the response. The entries
here point to existing requests in the time-based ring.

If we use the same ID, we have the same authenticator. We don't need to
distinguish between different retransmits with the same ID.

***

The copying should be kept to a minimum, so the request structures themselves
can best be kept in the ID-based ring.

No allocation or ring management needed there; if we use an ID and the slot is
occupied, we just free whatever's there. This is the c->req ring; ID based.

The other ring is limited to MAX_OUTREQS and is an array of pointers into the
ID ring. If we expire an ID from here, we look up the request and retransmit,
using the next server from req->query->srv[req->query->cursrv]. That server
may already have an old request (with an older ID). If so, we copy that ID to
the foremost position in the timer ring and retransmit.

Expiring is a neutral position as far as the timer ring capacity is concerned,
so we can keep this equal to the number of outstanding requests in the ID ring.

