Thinking about the memoization some more...it's safe/good because these are value objects that aren't intended to allow mutation of their state.  However, since we're using `Struct`, they do allow mutation.

It might be worth defining our own value object class generator that defines a struct-like class (with the necessary equality semantics that `Struct` provides) but without the writer methods for the attributes.  (Our of scope for this PR, obviously...I'm just thinking out loud).