Allow modules to be extended

Custom modules can now be created using the extend method, and then attached to an Application. Documentation and tests were added for this new functionality.