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 it is fine to have both, given the legacy of `Option`. Perhaps on some bright future date, the `Option` version can be deprecated, then discarded, but for now, I think this grossness is justified.