Use balanced KVO registration/deregistration calls to prevent unnecessary exceptions from being thrown

Fixes #285.

Contains a number of changes:

* Each class using KVO now registers and deregisters in a balanced fashion. Classes no longer attempt to remove non-existent observances.
* Classes now only use the `context` parameter to determine if an observation event is one that they should handle. There is now a context pointer for each observation type.
* Classes now correctly call super in `- (void)observeValueForKeyPath:ofObject:change:context:`.