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`.
This was just for tz-naiive timestamps, so I figured the replace was good. Does astimezone only convert, or will it add the timezone if none is given