moving away from using failure functions and towards exceptions
pushing everything over to use Exceptions, added unit tests!