Allow providing a block instead of a method_name argument to association()

Allow the `association(method_name = nil, options = {}, &block)` method to take a lambda/block if a `method_name` is not provided.

Also includes a change which allows the arguments sent to `association` to be in any order (`association(*args, &block)` - if an arg is a `String`/`Symbol` then we use it as the `method_name` or if it's a `Hash` then we use it as an options hash).

I'm not yet raising an exception when a lamda is used without a `:json_name` as the existing specs (before we cut our branch) use lambdas without a `:json_name` - so we need to look in to that more. I'll let you know when we think it's 100% clean to merge.