Add prefer, add isa? behavior to match ancestor types

I tried a half dozen multimethod libs for python, and all of them were hopelessly broken.  This was the closest one, all it was missing was being able to match ancestor types (like `object` with `str`).  Also added the prefer method, was just a straight port of clojure's implementation.  Tried to get it as close to clojure's behavior as possible, all that's left is thread safety and caching.