Add a lot of documentation and finalize the API

* Add javadocs for the public api
* Make interfaces for any of the repeated methods
* Add an extra test case for processors that throw
* Tweak the fluent api to make it consistent