### Summary

The code that checks the connection + become details in a loop is not applying the become state on connections that have the `connected` attribute set to `True`. If connected is `True` the else block will just re-use the existing connection plugin which won't have the `become` details from the first task on it.

https://github.com/ansible/ansible/blob/27ce607a144917e6b9a453813a7df6bbc9ea2213/lib/ansible/executor/task_executor.py#L562-L572

Note there are some other bugs that mask this problem:

* ssh never sets `connected = True` so will always re-create the connection and subsequently the updated become info
* Using `ansible_connection=paramiko` also works because it never matches the connection `_load_name` of `paramiko_ssh`
* Redirected collections will most likely also mask the problem because of the load_name vs `ansible_connection` value check which is most certainly wrong.

The code needs to be updated to do a proper check for the connection name `self._connection._load_name != current_connection` to actually work properly with redirected plugins and aliased names like paramiko and paramiko_ssh. The code also needs to be updated so that if a connection is re-used then the become plugin needs to be added/deleted if necessary.

The connection should also be closed when being dropped as well.

### Issue Type

Bug Report

### Component Name

task_executor
connection
become

### Ansible Version

```console
$ ansible --version
ansible [core 2.14.0.dev0] (low-level-become e91a069260) last updated 2022/08/03 08:18:13 (GMT +1000)
  config file = None
  configured module search path = ['/home/jborean/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/jborean/dev/ansible/lib/ansible
  ansible collection location = /home/jborean/dev:/home/jborean/ansible/collections:/usr/share/ansible/collections
  executable location = /home/jborean/.pyenv/versions/ansible-310/bin/ansible
  python version = 3.10.2 (main, Jan 18 2022, 12:56:09) [GCC 11.2.1 20211203 (Red Hat 11.2.1-7)] (/home/jborean/.pyenv/versions/3.10.2/envs/ansible-310/bin/python3.10)
  jinja version = 3.1.1
  libyaml = True
```


### Configuration

```console
N/A
```


### OS / Environment

N/A

### Steps to Reproduce

```yaml
- command: whoami
  become: '{{ item }}'
  with_items:
  - true
  - false
```

Doing `false` first reversed the problem where the 2nd iteration will not run with become

### Expected Results

First task is run with become and the 2nd is run without.

### Actual Results

```console
Both tasks are run with the first `become` value set.
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
'''
    This is the main worker class for the executor pipeline, which
    handles loading an action plugin to actually dispatch the task to
    a given host. This class roughly corresponds to the old Runner()
    class.
    '''
    def __init__(self, host, task, job_vars, play_context, new_stdin, loader, shared_loader_obj, final_q):
        self._host = host
        self._task = task
        self._job_vars = job_vars
        self._play_context = play_context
        self._new_stdin = new_stdin
        self._loader = loader
        self._shared_loader_obj = shared_loader_obj
        self._connection = None
        self._final_q = final_q
        self._loop_eval_error = None
        self._task.squash()
    def run(self):