Major Refactoring

* Adds several tests
* Adds buffering for variant streams
* Major refactors and code cleanups
* Adds javadoc
Thought it would be better to keep the class immutable once built. Sorry I read the Effective Java book a few days back, so those principles are still floating in my head :-P