Stop sending blocks as normal args - set on method

Sending blocks as normal args was making methods more complicated and
adding a lot of extra logic to try and distinguish procs sent as blocks
vs procs sent as a normal argument. Also, arity checking was more
complicated.

This commit reverts to the old way of setting a proc as a property on
the receiving function which then retrieves the block if it is used.