Issues/reader performance improvements

Closes #2938

Some of the things addressed are:
- a jump in the scroll offset when backfilling posts ends
- cell layout issues due to post indexes changing due to a save while scrolling but cached row heights were not
- estimated row heights used when cached heights should have been used.
- Also fixes an issue with the subscription vc not being released from memory. 

@astralbodies @jleandroperez Would really love to get your thoughts about how this patch defers a save operation until after scrolling has finished.   

The post list waits to refresh its layout until after scrolling ends. A consequence is when new content is saved while scrolling, NSIndexPaths can point to new content that doesn't match cached row heights. Visual oddity ensues.  Waiting to save the context until scrolling stops is the simplest, most direct approach to address this that I could think of.  Would love to entertain alternate approaches.   I tried doing something fancy with some extra parent/child contexts but it got ... overly complicated ... but maybe there is a more elegant solution.  

Lastly, #2938 targets 4.7 as a bug fix but the change here is one I'd want to test for longer so i think we'll push to 4.8. 
Huh. Disregard that ^^. Capturing the context in the callback block won't do the trick. (I imagine) one way to do this would be to have a queue of blocks "to be executed" as soon as scrolling is done.

That is, assuming that the refresh method can, in fact, get triggered multiple times. If not, it should be safe. (In which case we could add a NSAssert to ensure it's nil at the time it gets set, + nuke it after calling save?)