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?
What do you mean? It's a safe unittest. It makes sure the code inside that unittest is useable in a safe context. It might be smarter to simply add the tag to existing unittests that actually do things though...