schedule function offsets

Makes `AfterOpen` an offset from the actual market open, not from the first bar of data for a day.

Prevents offsets of 0 from being passed to `AfterOpen` or `BeforeClose`.
Do we need to coerce ```self._dt``` here?  Looks like its initial value has been coerced, and the subtraction below would result in a noop from ```_coerce_datetime```.  If we have the need to cache this value because ```_get_open``` is called many times, then should we also remove the coercion?