<!--- Verify first that your issue is not already reported on GitHub -->
<!--- Also test if the latest release and devel branch are affected too -->
<!--- Complete *all* sections as described, this form is processed automatically -->

##### SUMMARY
When for any reason the .ansible/ directory is inside a path **with whitespaces**, the 'control_path' generated by default is wrong, and thus the SSH commandline.

The addition of quotes surrounding the 'control_path' inside 'ansible/plugins/connection/ssh.py' fixes the bug.

##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
Connection plugin

##### ANSIBLE VERSION
<!--- Paste verbatim output from "ansible --version" between quotes -->
```
ansible 2.8.2
  config file = /Users/pposca/proyectos/kipeos-devops/ansible.cfg
  configured module search path = ['/Users/pposca/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /Users/pposca/.virtualenvs/kipeos-devops/lib/python3.7/site-packages/ansible
  executable location = /Users/pposca/.virtualenvs/kipeos-devops/bin/ansible
  python version = 3.7.3 (default, Jul  7 2019, 18:15:21) [Clang 10.0.1 (clang-1001.0.46.4)]
```

##### CONFIGURATION
<!--- Paste verbatim output from "ansible-config dump --only-changed" between quotes -->
```
DEFAULT_HOST_LIST(/Users/pposca/proyectos/kipeos-devops/ansible.cfg) = ['/Users/pposca/proyectos/kipeos-devops/hosts']
INTERPRETER_PYTHON(/Users/pposca/proyectos/kipeos-devops/ansible.cfg) = auto
```

##### OS / ENVIRONMENT
- MacOS 10.14.5
- Mackup (so .ansible/ is a symlink to a directory with whitespaces in its path)
- Python 3.7.3 

##### STEPS TO REPRODUCE
Having .ansible inside a directory with whitespaces in its path:

```
ansible all -m ping
```

##### EXPECTED RESULTS
```
mydomain.com | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
```
##### ACTUAL RESULTS
```
ansible 2.8.2
  config file = /Users/pposca/proyectos/kipeos-devops/ansible.cfg
  configured module search path = ['/Users/pposca/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /Users/pposca/.virtualenvs/kipeos-devops/lib/python3.7/site-packages/ansible
  executable location = /Users/pposca/.virtualenvs/kipeos-devops/bin/ansible
  python version = 3.7.3 (default, Jul  7 2019, 18:15:21) [Clang 10.0.1 (clang-1001.0.46.4)]
Using /Users/pposca/proyectos/kipeos-devops/ansible.cfg as config file
setting up inventory plugins
host_list declined parsing /Users/pposca/proyectos/kipeos-devops/hosts as it did not pass it's verify_file() method
script declined parsing /Users/pposca/proyectos/kipeos-devops/hosts as it did not pass it's verify_file() method
auto declined parsing /Users/pposca/proyectos/kipeos-devops/hosts as it did not pass it's verify_file() method
Parsed /Users/pposca/proyectos/kipeos-devops/hosts inventory source with ini plugin
Loading callback plugin minimal of type stdout, v2.0 from /Users/pposca/.virtualenvs/kipeos-devops/lib/python3.7/site-packages/ansible/plugins/callback/minimal.py
META: ran handlers
<mydomain.com> ESTABLISH SSH CONNECTION FOR USER: None
<mydomain.com> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o 'ControlPath=/Volumes/Apple HDD/VDrive/Dropbox/Mackup/.ansible/cp/fc95ded756' mydomain.com '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<mydomain.com> (255, b'', b'command-line line 0: garbage at end of line; "HDD/VDrive/Dropbox/Mackup/.ansible/cp/fc95ded756".\r\n')
mydomain.com | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: command-line line 0: garbage at end of line; \"HDD/VDrive/Dropbox/Mackup/.ansible/cp/fc95ded756\".",
    "unreachable": true
}
```

##### VALUE OF THE VARIABLE 'b_args'

Note the whitespace after 'Apple':
```
(b'-o', b'ControlPath=/Volumes/Apple HDD/VDrive/Dropbox/Mackup/.ansible/cp/fc95ded756')
```

##### RELATED ISSUES
#7713 #31916


'''
        Takes a command array and scans it for ControlPersist and ControlPath
        settings and returns two booleans indicating whether either was found.
        This could be smarter, e.g. returning false if ControlPersist is 'no',
        but for now we do it simple way.
        '''
        controlpersist = False
        controlpath = False
        for b_arg in (a.lower() for a in b_command):
            if b'controlpersist' in b_arg:
                controlpersist = True
            elif b'controlpath' in b_arg:
                controlpath = True
        return controlpersist, controlpath
    def _add_args(self, b_command, b_args, explanation):
        """
        Adds arguments to the ssh command and displays a caller-supplied explanation of why.
        :arg b_command: A list containing the command to add the new arguments to.
            This list will be modified by this method.
        :arg b_args: An iterable of new arguments to add.  This iterable is used
            more than once so it must be persistent (ie: a list is okay but a
            StringIO would not)
        :arg explanation: A text string containing explaining why the arguments
            were added.  It will be displayed with a high enough verbosity.
        .. note:: This function does its work via side-effect.  The b_command list has the new arguments appended.
        """
        display.vvvvv(u'SSH: %s: (%s)' % (explanation, ')('.join(to_text(a) for a in b_args)), host=self.host)
        b_command += b_args
    def _build_command(self, binary, subsystem, *other_args):