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 should work because `freq='B'` is a superset of the custom `CDay` we define as tradingday.trading_day, but this does jump out as a possible place for misalignment.

Without the context of other classes that had used it, it does seem a bit of overkill over something like:

```
class OncePerDay(StatefulRule):
    
    def __init__(self, rule=None)::
         self.date = None
         self.triggered = False

    def self.should_trigger(self, dt):
         dt_date = dt.date()
         if self.date is None or self.date != dt_date:
             # initialize or reset for new date
             self.triggered = False
             self.date = dt_date      
  
        if not self.triggered and rule.should_trigger(dt):
             self.triggered = True
             return True
```