dlist: Fix bug in DList::merge

Did not properly allow runs from the `other` list to be merged in. The
test case was using a wrong expected value.

Edited docs for merge so they explain more clearly what it does.

Also make sure insert_ordered is marked pub.
dlist: Implement DoubleEndedIterator and use for .iter() and .rev_iter()
dlist: Use DoubleEndedIterator for .consume_rev_iter()
dlist: Use a DoubleEndedIterator for .mut_iter() and .mut_rev_iter()

Unify the mutable iterators too. Switch the ListInsertion trait to use
method .insert_next() and .peek_next() for list mutation. .insert_next()
inserts an element into the list that will not appear in iteration, of
course; so the length of the iteration can not change during iteration.