Refactor and update tests

Lots of refactoring, updates the tests to run again (still fails 2 tests), and adds support to pass the options hash through in post requests.
:+1: for more ruby-esque code