Simplify observer interface, which allowed simplifying joinpointObserver a bit.  Rename datasource save() to update()
More tweaks to observers. Observers can be chained more easily, since they return a function with an api consistent with one expected when passed to other observers