libcollections: add seekers to DList

Iterator semantics... really don't make sense with a linked list. If you want to seek into the list, and then start manipulating it freely, seeking back and forth as needed, *which is the entire usecase for a linked list*, then an iterator that "consumes" its range just doesn't make sense.

So here's a "seeker" which lets you actually do the things that Linked Lists do well. Some things refactored along the way to reduce some duplication. There's probably some more places that could be refactored after adding this.