Large refactor - fixes dramatic "don't use NSArray as a dictionary key" bug.

Keys are now CKVOTokens - these contain the block. The helper's
dictionary now uses the token's index (an increasing integer) as the key
and the token as the object.

The KVOToken's index is used as a context.

This fixes a whole host of bugs - but mainly using an NSArray as a key
to a collection is a BAD idea - due the way hash works on collections.

Added more tests to help test all possibilities.