Re-write observable module

- simplify and reduce inconsistency in updating properties and emitting changes: only one event stream is used