Reuse FixedOffset instances by using a global cache
Avoid dt.astimezone() by doing offset addition ourselves

Since we only handle fixed offsets, a simple timedelta addition
suffices. This is a performance improvement.