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
why not just `new(path, options).public_send(http_method)`?