Improve reference date determination for scheduling. #3964.

Previously, the logic that determined the reference date for scheduling the next event would fail when a participant had any contacts with an MDES missing-coded date (e.g., 9777-97-97). It would always pick such a contact as "most recent" and then complain that
the most recent contact had no date.

This fixes that problem by ignoring such contacts when picking the most recent contact date. It also adds fallbacks to event end and start dates for participants who have no valid contact dates at all.

It also removes the `#last_contact / #most_recent_contact` method from `Participant`. Though that method was public, it was only ever used inside of Participant, and only used for determining the most recent contact date. I replaced it with a private method that just does that.