Here we define the API for migrations.
Classically, a migration has two methods which a user may call, up and down. These will be retained. In addition, there are two optional methods which will get run on all migrations, check and pre-flight. These must be overridden in a subclass to have any effect
The API described below is enforced by the Migration Manager.
Only down() and up() are absolutely required.
The optional check() and preflight() are called in order to assist with the migration.
The life-cycle of a migration goes as follows:
:py:func:`.preflight` -> (:py:func:`.up` | :py:func:`.down`) -> :py:func:`.check`
Raised when the registration is locked and attempted to be modified