Add Missouri Hub profile

- Add MissouriMapper and related tests
- Add lib/textnode.py
- Add `spectype' module with list of valid types.

Notes:
- Subject strings are split on semicolons in
  MissouriMapper.map_subject().  Splitting is done with the `shred'
  pipeline module in some other profiles.
- MissouriMapper overrides the title mapping performed in
  OAIMODSMapper.
  See https://issues.dp.la/issues/7617#note-19, item 4.
  OAIModsMapper was designed to treat various attributes not relevant
  to Missouri and appears designed to take the last title element it
  encounters.
- Titles and descriptions are assigned as lists.
- As with OAIMODSMapper's treatment of spatial data, we filter out
  hierarchicalGeographic properties that are not in the allowed list.
  We do, however, allow `continent', unlike in OAIMODSMapper.
One reason is clarity.  If one has any question about how the language array is assigned, one need only look at this function.  Otherwise, one has to know to look at the profile document to see which modules are being used, and look for a module named "shred" which _splits_ a value, and does not _destroy_ it as the name implies, and then read the `shred` module to figure out what the heck it does.  :-)

There was another case, in map_subject, where I also did the splitting in that function, because (as I recall now, a week or more later) the parent class's map_subject didn't split and re-join things the way we would have wanted.