Added a lot of javadoc for different classes to try and make clear what
each class does