Adds a bunch of nice stuff

* Adds tests that try to be as decoupled from the code as possible
* Adds more generic requests
* Abstracts the endpoints
* Adds basic auth support
any good reason for using class variables instead of class level instance variables?