Detect programmatic changes to attributes (except [value]) + prevent potential event listener leaks

@gaurave

* `SparkWidget.addRemoveEventListeners` uses `addEventListener`, which, as mentioned in #2535, is guaranteed to not leak event listeners. It's possible that the old code didn't leak either, but stay on the safer side.
* `MutationObserver` will further detect changes to the element's attributes such as `disabled`. Sadly, `value`, `checked` etc. are special (not pure attributes), so those are still undetected. Something to investigate in future... For now everything seems to work the way we use it.