I synchronize on `observer` rather than `disposable` because this way the callbacks for each component of the key path synchronize with each other. I could make another object and pass it along each recursive call, but `observer` is going to be the binding, so it's the right granularity.