Observer implementation, take 2

@simpsus, take a look. I think this looks pretty good.

This takes over where https://github.com/danbernier/WordCram/pull/33 left off.