Observers can now be suspended/resumed

This sets us up for suppressing execution for hidden outputs.
Split suspended and invalidated into separate vars
Observable: rename dirty to invalidated
Move invalidated above run
Merge branch 'suspend-observer'