Implemented as a simple doubly-linked list protected by a
single lock and using conditions to manage blocking.

To implement weakly consistent iterators, it appears we need to
keep all Nodes GC-reachable from a predecessor dequeued Node.
That would cause two problems:
- allow a rogue Iterator to cause unbounded memory retention
- cause cross-generational linking of old Nodes to new Nodes if
a Node was tenured while live, which generational GCs have a
hard time dealing with, causing repeated major collections.
However, only non-deleted Nodes need to be reachable from
dequeued Nodes, and reachability does not necessarily have to
be of the kind understood by the GC.  We use the trick of
linking a Node that has just been dequeued to itself.  Such a
self-link implicitly means to jump to \"first\" (for next links)
or \"last\" (for prev links).