Safely handle adding multiple observers for the same keypath.

Use a dictionary to hold a block for each observer.
Use one dictionary for each keypath.
Remove dictionary when all observers for a given keypath has been removed.
This will enable adding multiple block observers for the same keypath.