NcsCode to model association improvements (#3633)

This set of commits:

* Adds on-demand in-memory caching of `NcsCode` code lists
* Replaces the `belongs_to` association that previously tied a model attribute to its code list with a dynamically generated module that can (potentially, but not yet) support different code lists for the same attribute in different versions of the MDES.
* Enables validation of set code values and NcsCode instances:
  - Rejects `NcsCode`s that have the wrong list name for the attribute
  - Rejects `NcsCode`s or directly-set code values which are not within the code list for the attribute
* Corrects all the specs that were allowed to be broken by the lack of validation previously. (I hope.)