General purpose priority queue.
Each element is associated with a key, and the priority queue supports
viewing and extracting the element with the maximum key.

A worst-case bound is given for each operation. In some cases, an amortized
bound is also specified; these bounds do not hold in a persistent context.

This implementation is based on a binomial heap augmented with a global root.
The spine of the heap is maintained lazily. To force the spine of the heap,
use seqSpine.

We do not guarantee stable behavior.
Ties are broken arbitrarily -- that is, if k1 <= k2 and k2 <= k1, then there
are no guarantees about the relative order in which k1, k2, and their associated
elements are returned. (Unlike Data.Map, we allow multiple elements with the
same key.)

This implementation offers a number of methods of the form xxxU, where U stands for
unordered. No guarantees whatsoever are made on the execution or traversal order of
these functions.