Added habtm and many bug fixes

There is still some support that I'm adding. This pull is critical because of a bug I found in the midst of coding this.

Mainly, while looking for ancestors in order to inherit hooks, we are calling `klass.arkenstone_hooks` on classes that don't have arkenstone included in them; such as `Object`, `Module`, and `Class`.

I added a check to see if the class responds to arkenstone_hooks before trying to use it.