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.
```
      250    0.000    0.000    0.002    0.000 zipline/algorithm.py:259(handle_data)
```

This is the replacement for the raw call to `handle_data`, this seems like it does not add enough overhead to matter; however, I could be wrong.