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
```
`Series.apply` is only really a performance boost when you're working with numerical data, and even then it's not going to make a difference until you're talking about a series with on the order of tens of thousands of rows.  Testing this in an IPython shell suggests that the series implementation is about 30x slower than using a for-loop on a list of functions.

```
funcs = [lambda x, y: x + y or i in xrange(10)]
func_series = pd.Series(funcs)

%%timeit
for func in funcs:
    func(3, 4)
> 100000 loops, best of 3: 2.87 µs per loop

%%timeit
func_series.apply(lambda func: func(3,4))
> 10000 loops, best of 3: 89.6 µs per loop
```

In this case, however, iteration performance isn't really an important consideration.  For any reasonable use case, this data structure is going to have *maybe* 10-15 functions at the absolute most.  For that scale, the costs you're going to see in performance are insignificant compared to the added maintenance costs of a more complex implementation.