SSP-2639, SSP-2638
Canceling course plan drag/drop can plan course in an unexpected term
Unplanning a course does not re-validate plan/template
SSP-2639 Refactor previous fix to eliminate transient state

The previous fix for this issue introduced more component instance
state (previousSemesterPanel). This did address the original bug
report, but exacerbated the underlying technical flaw, which was
keeping what really should be transient function arguments as
component instance state. (It's semantically incorrect, and people
forget to clean it up (which is exactly what happened here).)

So this fix eliminates both that new state and two previous
component instance-state fields: droppedRecord and droppedFromStore.
Now the 'drop spec', i.e. the salient fields from the actual
'drop' event, are packaged up into a 'courseMoveSpec' object which
is passed around as a function argument. This required some
unfortunate boilerplate to ensure that argument can be curried
across asynchronous AJAX calls. But overall I think the resulting
implementation is much less fragile.

This does not eliminate excessive state keeping altogether. E.g.
minHrs and maxHrs should not be instance fields. But that can
wait for another time.