Handle pop() and setdefault() correctly in UpdateDictMixin and add some testcases

`pop()` and `setdefault()` should only trigger `on_update` if the dict was actually modified.

Additionally there were no testcases so I added some.