fix bugs in datasource observation

- Previous impl allowed for duplicate observers on a single datasource because identity wasn't checked.
- Move to NSHashTable with weak references to hold on to observers.