Models: Split models.py into several files

refs #7135

models.py is around 2000 lines long, and unwieldy to work with. Move it
to a models directory and split into several files. Most models get a
file, with some similar models grouped together in the same file. Use
init.py used to maintain the same import structure.

Add app_label to all models to work with split locations. Fix pep8
related changes, made protocol spaces and location purposes
alphabetical.
Clean up constants.py

Import models and forms, instead of individual classes. Move everything
inside PROTOCOL definition.
rsync: log verbosely to storage_service.log

Fixes #7234.
Add DisableableSelectWidget

Add custom widget that allows specific values in a Select widget to be
disabled.
Restrict Location purposes based on Space's protocol

refs #6939

Add ALLOWED_LOCATION_PURPOSE to each protocol Space with a whitelist of
what Location's purposes are allowed in that Space.  To enforce this,
disabled invalid purpose in the purpose dropdown of the LocationForm, and
enforce it in clean_purpose.