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.
auto merge of #7735 : blake2-ppc/rust/dlist, r=thestinger

Use DoubleEndedIterator to unify the iterators in extra::dlist. The double-ended iterators are straightforward and the .iter() and .mut_iter() simply use an elements left counter to make sure the iterator terminates at the right point.

Also fix a bug of mine in DList::merge, and DList::insert_ordered not being pub.