Add CalendarEventCache.

This will (eventually) cache CalendarEvent instances between models and handle
updating them etc. For now, just observe data source changes and ask model
instances to reload themselves.
Pick a different color.
Merge pull request #133 from rburchell/calendar

Calendar changes