addresses #3 refactor matrix types as deftype, but still need standard clojure protocol impls