Adds a Double ended queue

This is an implementation based on Chris Okasaki's Bankers double ended queue from Purely Functional Data Structures.

It allows constant time access to both head and tail of the queue. constant time prepend and constant time append.  Dequeueing from either end of the list is amortized constant time.
I think `sealed abstract class` is better. (for binary compatibility)