A few things,
The connection: keyword just changes the connection, while delegation
changes the target host.
When using connection: local you end up executing on the controller
(your connection is a local fork instead), not delegating to
localhost, there is another step on that. Use delegate_to: localhost
is what you normally want to do.
if you delegate_to: vm_name but set connection to local, you are not
really connecting to vm_name (unless you are overriding the connection
in other ways, like via connection variable). So they work together
and did what you asked them to, it is just that what you asked them to
do makes little sense.