Switch the end_node to an embedded node.
Convert head_node also to a Node embedded in the struct.
Move erase handling to a private helper.
Move insert code to private helper.
Fix swapping of end_node.prev.
Add caching to the CacheList
Make clear() into an O(1) operation again.