Initial commit of map experiments with working bijection implementation.
Implemented bijection, surjection, inverted-surjection, bipartite, set-map (building-block datastructure), and constructor functions.

TODO: Refactor to make clear differences in implementation.
Fixed several bugs in Surjection classes.
A bit more cleanup.
More cleanup of code -- imported class names, consolidated lines, etc.
Made all constructors private (as things get mucho fucked up if you hand a constructor something that is not the appropriate map type) and added more comments.
Lots of code cleanup.
Futher code cleanup.
Even more code cleanup, and also added a toString method to everything.
Fixed bug relating to parenthesis misplacement in InvertedSurjection.
Performance improvements for insertion (assoc) across the board.
Added documentation for factory functions.
Renamed core.clj to smart_maps.clj, as I will be adding other subnamespaces for other experiments which might rely on the bijection/surjection/bipartite framework.
First working (I think) version of attribute maps implemented in smart-maps.
A few small bug fixes.
Renamed factory function to "attr-map" for succinctness, and added two accessors which use set/intersection to find keys with multiple attributes.
Now throwing more exceptions to prevent weird illegal state and give more intelligible error messages.
A tiny bit of code cleanup.
AttributeMap conj is now compatible with into for maps.
Made conj even smarter for AttributeMaps.