Immutable model

Move to an immutable model approach.

While this isn't really truly immutable (collections may be mutated), it removes the setters from all model classes. I think it's a good balance between increased complexity and not allowing the models to be mutated.

This applies to #46