Cache row heights. Use cached heights when possible.

Fixes #2073 

When changes to core data trigger the table view to refresh, a scrolled table view recalculates its content offset based on estimated heights, not actual heights of cells.  Caching cell heights and returning the cached heights corrects the jump.