Moving API to a submodule

* Moving API to a module
* Using Abstract Classes to create a base that can be implemented, extended or overridden outside the API
* Allows us to maintain the API strictly as a module - makes things a little cleaner

<!---
@huboard:{"order":1.5}
-->