cleanup

removed several unused private methods
fix tests with non-symmetric comparator

this allows us to use a consistent cmp() helper
restore second call to getBoundaryNode() when iterating

that the first proved to be required makes this one also suspect
remove untested NavigableSet implementation

comparator() was incorrect (and not trivial to correct)
the NavigableMap interface allows entrySet() to just be a set (implicitly
sorted?)
iterator constructor cleanup

only calculate start node once
remove duplicate method definitions

these just pass through to the interface
remove {subMap,headMap,tailMap} shortcut methods

don't need to check the inputs here, the more-parametered methods have the
same constraints
simplify boundary checks

toEnd && !checkUpperBound(key) -> !checkUpperBound(key)
!fromStart || checkLowerBound(key) -> checkLowerBound(key)
fuzzing found bug in removeRightmost

RandomisedTest is far more effective with NODE_SIZE = 8, since that
triggers more node deletions & rebalancings
return (node, index) successor from remove*

previously, remove* returned the key of the (ascending-only) successor
to the removed element. now the exact successor (ascending or descending)
is returned, removing the need for a follow-up traversal when the tree
structure changes.

improvements to the submap iterators mean that getBoundaryNode() is no
longer required when iterating, just when removing elements.

this also fixes maps that allowed the null key, which couldn't distinguish
a null-keyed successor from no successor.