Fix completion blocks being completely broken.

I'm not exactly sure why the block was stored using associated objects in the first place, but regardless, it did not function, and the tests did not cover this issue.

Changed it to a much simpler implementation, which simply stores a copy of the block on the fake delegate.

cc @dannygreg