Deduplicate code in TZInfo::TimezonePeriod

While working on #86 I have noticed there is a lot of unnecessary duplication in current TimezonePeriod extensions so I have made an attempt to somewhat reduce the churn without obscuring the logic too much. What do you think?

It passes the tests though I am not 100% sure if I've understood the `rrule` logic completely; maybe it could be refactored further.