improve KVO. better handle add/remove observers. close #285