Add basic caching

Since calculating all paths will be expensive (both db wise and time
wise) when we have many points this adds some very basic caching so we
don't need to recreate the json every page load. Only when a new
SpotMessage or SpotFeed is added.

This is based on DHH's post
https://signalvnoise.com/posts/3113-how-key-based-cache-expiration-works

Basically - you base caching on the top model. When SpotGroup's
updated_at changes the cache is invalidated. By adding :touch to the
belongs_to relations when anything downstream is changed SpotGroups
updated at is updated.