Refine orphan_sponsroship_status changes

JIRA task https://osraav.atlassian.net/browse/OSRA-113

- Change sponsorship inactivation so that `orphan_sponsorship_status` is set to 'Previously Sponsored'
- When `orphan_status` changes from 'Active'  to 'Inactive', 'On Hold' or 'Under Review', `orphan_sponsorship_status` changes to 'On Hold' (ineligible for new sponsorship)
- When `orphan_status` changes from 'Inactive', 'On Hold' or 'Under Review' to 'Active', `orphan_sponsorship_status` changes to 'Unsponsored', 'Sponsored' or 'Previously Sponsored', reflecting orphan's sponsorship history

### JIRA
OSRA-113 #Code-Review
OSRA-169 #Code-Review
OSRA-170 #Code-Review
Emphatically agree. Raising the level of abstraction in my code is something I keep reminding myself to do regularly.
Follow-up question: Along the same lines, I would like to change `self.orphan_sponsorship_status = OrphanSponsorshipStatus.find_by_name 'Name'` to something similarly higher-level. Good idea? The `Orphan` model already has `set_status_to_sponsored` & `set_status_to_previously_sponsored` but they operate on the db record via `.update!`, whereas here I want to set the status on the in-memory object. In this context, would introducing e.g. `change_status_to_sponsored` lead to more confusion that can be justified by the improvement to readability & abstraction?