Given a list of migration steps in ascending chronological order, finds
the latest migration step starting state that matches the current database,
and performs all migrations from that point until the end of the list.
The whole operation is performed as a single transaction.
If no matching starting state is found, a ValidationError is thrown.
If the database is already in the state specified by the end state of the
final step, no migration is performed.
Note that when looking for a matching starting state, index methods for
indexed columns are not taken into account. Two columns c1 and c2 are
considered to be identical if c1 is indexed with index method foo and
c2 is indexed with index method bar.