ENH: new api method: add_event

This is another version of a time/event management api.

This version allows users to schedule functions to be called with (context, data) args at frequencies other than the backtest frequency. Right now the functions are called before the regular handle_data routine, but after could make sense, it would allow people to set context variables.

Example workflow
```
def func_a(context, data):
    # stuff
 
def func_b(context, data):
    # other stuff ...

def func_c(context, data):
    # ...
 
def initialize(context):

    # Set functions to be called every 20 min
    add_event(freq='20T', functions=[func_a, func_b])

    # For once/day events, specify a 'when' function
    add_event(time_func=BeforeClose(minutes=5), functions=[func_c])
 
def handle_data(context, data):
    # Nothing to be done
    pass
```
I'm not sure I follow here. The freq is either a pandas offset ID or something that can be converted to an offset. I think the biggest hurdle I am dealing with is making this work for frequencies both greater and less than 1 business day.

If the frequency is less than one day, it's safe to assume that the event can happen exactly at intervals of that frequency, so it is safe to roll the time forward. However, the first bar that satisfies frequencies > 1day will always be the market open and it's not safe to assume they want the event to happen exactly at the open. That means the time can't be rolled forward because it causes the rest of that day to evaluate to False.

That is the reason for having the time_func (this variable name does suck), it's the condition that has to be met before the time can be rolled forward. It has to be able to specify a frequency, and a rule for when within that period it can occur.

I hope this makes sense