### 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
te._get_loop_items = MagicMock(return_value=[])
        res = te.run()
        te._get_loop_items = MagicMock(return_value=['a', 'b', 'c'])
        te._run_loop = MagicMock(return_value=[dict(item='a', changed=True), dict(item='b', failed=True), dict(item='c')])
        res = te.run()
        te._get_loop_items = MagicMock(side_effect=AnsibleError(""))
        res = te.run()
        self.assertIn("failed", res)
    def test_task_executor_run_clean_res(self):
        te = TaskExecutor(None, MagicMock(), None, None, None, None, None, None)
        te._get_loop_items = MagicMock(return_value=[1])
        te._run_loop = MagicMock(
            return_value=[
                {
                    'unsafe_bytes': AnsibleUnsafeBytes(b'{{ $bar }}'),
                    'unsafe_text': AnsibleUnsafeText(u'{{ $bar }}'),
                    'bytes': b'bytes',
                    'text': u'text',
                    'int': 1,
                }
            ]
        )
        res = te.run()
        data = res['results'][0]
        self.assertIsInstance(data['unsafe_bytes'], AnsibleUnsafeText)
        self.assertIsInstance(data['unsafe_text'], AnsibleUnsafeText)
        self.assertIsInstance(data['bytes'], text_type)
        self.assertIsInstance(data['text'], text_type)
        self.assertIsInstance(data['int'], int)
    def test_task_executor_get_loop_items(self):