Refactor extensions with a more functional approach

All extensions right now are written as modules to be included in another class. They should be re-written to expose class functions which take an instance of the object they would be extending.

This will allow us to make the monkey patching optional and to access the extensions in a more deliberate way.