lawrence cyoa ready for review

it's awesome. would love to show you and discuss
This is a sort of two-step memoize, but it's unclear that this is happening because the memoize-storage is happening remotely from the memoize-retrieval. That leads to a bit of a maintenance nightmare. What about:

```
def tz_offset(airport)
  @airport_offsets[airport] ||= offset_from_airport(airport)
end

def offset_from_airport(airport)
  airport = airports.find { |a| a["fs"] == airport }
  sprintf("%+05.f", (airport["utcOffsetHours"].to_f * 100.0))
end
```

A few things here that may not be obvious:
1. Use `airports`, not `@airports`, when you've gone to all the trouble of setting up an accessor.
2. Use `.find` or `.detect`, not `.select {}[0]`.
3. Your `|a|` local name is still bad but there are too many instances of the word airport around here :)
4. Now all side effects are contained to the original method.