Split DList Node into DNode and PayNode.

This splits the "Nodes" in DList into two types of node:
- The "base" DNode that has no payload.
- The "derived" PayLoad: A DNode with a payload.

Doing this helps avoid allocating a T for no reason in the sentinel node. It should also remove some template bloat, as a few functions actually had no dependency on the type carried by the payload.

@DmitryOlshansky : What do you think?
The only issue with this approach, is safety. I marked it as trusted, but truth be told it really just isn't safe.

That said, currently everything is GC allocated, but if and when we move to allocators, the entire container will probably seize to be safe.

Might as well not make any eager false promises?