Cache the value of `changed_attributes` when calling `changes_applied`

`changes_applied` calles `changes`, which will call `changed_attributes`
multiple times in a loop. This method actually performs work now, so we
should cache the results while looping over it when we know it cannot
change.
I'd rename it to `caching_changed_attributes` because `cache_` implies it will be persisted and not just set for duration of method execution.