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.
This is feeling a little gross. We have to figure out if we are going to go "whole hog" on Maybe or not, We don't want to have to add Option/Maybe versions of all the functions everywhere