ENH: Event Manager rework

The event manager is a way to allow functions to be called when certain datetime conditions are present.
This is to eliminate the need got `get_datetime()` checks in the `handle_data` function.
This piggybacks off the work and usage research of @humdings.

Opening this pr now to get some eyes on it before continuing with tests.
Do we need to pass a copy of the `datetime` object? That is a small inefficiency that could add up.
Can we use the `self.datetime` that it copies instead?