Making all 'inner' objects readonly and making constructors private/protected.
Alternatively they could be made internal but we probably don't want to expose
them to anything outside this library as I assume there will be an entrypoint for
all of them.