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.