Fundamentally everything needs to be immutable because anything can be a key in a map, and if you can't actually represent the full spectrum of edn by default what is the point?

I agree that ideally vectors would actually be represented by an actual [PersistentVector](https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentVector.java) implementation and lists represented by a singly-linked list (as they are in clojure).

I'm also pro all returned representations being over-rideable.  

There are already several pure-python implementations of clojure's persistent maps, most likely I'll bring in [Alex Gaynor's PersistentDict](https://github.com/alex/optimizer-model/blob/master/optimizer/utils/persistent_dict.py)