A simple caching mechanism for NcsCodes. #3633.

Very, very simple. Just a fancy hash.
Add tests for existing finders. Done with #3633.
Implement finders in NcsCode using cache. #3633.

Fortunately it seems like the bulk of non-attribute access to NcsCodes
in the application comes through these finder methods.
Prevent modification of cached lists and instances. #3633.
Use NcsCode.for_list_name_and_local_code instead of where. #3633.

`NcsCode.for_list_name_and_local_code` is now backed by the cache, so
its preferable to `where` for finding one code.
Move CodeListCache to Mdes module. #3633.

Rationale: it's as much MDES-related as CodeListLoader or
NcsCodedAttribute, both of which are in the Mdes module.
Promote NcsCodedAttribute to top level. #3633.

It will shortly have much more to do.
Implement readers and writers. #3633.

This replicates most of the basic functionality of a belongs_to backed
by the code list cache. It also has the beginnings of extra behavior
on the setter (i.e., you can set the setter with a code value instead
of an NcsCode and have it do the right thing.)
Remove never-used .with_codes scope. #3633.
Restore automatic -4 values for blank codes. #3633.
Remove belongs_to examples for coded attributes. #3633.

This is a good example of why specs should describe behavior, not
configuration.
Use real codes for this spec. #3633.

The other option would be to reset the cache after the made-up ones
are saved. Doesn't seem necessary to bother, though.
Correct PSU codes. Done with #3633.

With the belongs_to implementation, these were being nilled out by AR.
Then the `set_psu_code` callback on MdesRecord would set them to the
valid value that's in the spec configuration.

The new implementation doesn't nil invalid values out (it will report
them as validation errors instead eventually), so these invalid PSU
codes were leaking into tests that cared about having valid PSUs.
:event_type is no longer an association. #3633.