Make Attributes Immutable #80

Finish making a lot of code in the Intermediate immutable, including
Attributes.

Fixing tests for this.

This does not include type checking of attributes.

This does not yet distinguish between an attribute that is missing and
attribute that is set but not expected. The number of exceptions to be
listed in "throws" would grow large, and may need to be rethought.
I think it's okay for this to be a different exception type. There really are quite a few ways that attributes can "go wrong" from the perspective of bad typing, and I think it's more useful to have separate exceptions for each condition to be able to indicate what has gone wrong as precisely as possible.