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.
This might be something to spot check with profiling as well. Depending on how it does, have you considered caching the result of `get_open_and_close`? Though the date compare and indexing of the open_and_close DataFrame may come out in the wash.

```
if self.curr_close is None or dt > self.curr_close
    self.curr_close = ENV.get_open_and_close(dt)[1]
return self.curr_close - self.offset < dt
```