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.
I support `handle_data` becoming a special case of the Event logic, since it makes it clear when/how that function is triggered in comparison to other events, and is a nice completion of the logic of the Event paradigm.

However, do we have an understanding of how much CPU time it adds versus the current implementation? It seems like it should be minimal as it seems like it is just the iteration of a single element in the event list, and calling the function which just returns `True`. It would be good to see some timing comparisons and/or comparisons of cProfile between the two.