SSP-2908 Refactor UI-driven program status transitions

Major rework:

  - Fix non-functional transitions (possible regression from
    watchlist)
  - Wait to update client-side person models until transition
    API call succeeds
  - Error message when transition API call fails
  - Consistent 'student not selected' error messaging
  - Prevent duplicate transitions (with the exception of
    Non-Participating)
  - Update Main immediately with transitions
  - Avoid race condition loading transition reasons in Non-
    Participating dialog
  - Avoid loading too few transition reasons in Non-Participating
    dialog and Dashboard and Details tab in Main
  - Dynamic post-quick-add program status