Only notify when extent changes.

This avoids unnecessary work and some infinite loops.
Restructure state to shave a few bytes.