### Summary

`ansible-galaxy collection install` makes a lot of requests to galaxy.ansible.com and can occasionally hit the rate limit. When that happens, galaxy.ansible.com will return a 520 http code and `ansible-galaxy` fails to download the collection and exits. Ideally when the client encounters a rate limiting http code (either 520, or 429), it should wait, slow down the request rate and try again rather than exiting.

More information is available here: https://github.com/ansible/galaxy/issues/2429 

### Issue Type

Bug Report

### Component Name

ansible-galaxy

### Ansible Version

```console
$ ansible --version
root@ubuntu-s-1vcpu-1gb-nyc3-01:~# ansible --version
ansible 2.10.7
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.8/dist-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0]
```


### Configuration

```console
$ ansible-config dump --only-changed
root@ubuntu-s-1vcpu-1gb-nyc3-01:~# ansible-config dump --only-changed
root@ubuntu-s-1vcpu-1gb-nyc3-01:~#
```


### OS / Environment

All

### Steps to Reproduce

Run `ansible-galaxy collection install `amazon.aws`. If your internet is fast enough, this will occasionally fail when galaxy.ansible.com returns a 520 error code.

### Expected Results

Collection should be installed.

### Actual Results

```console
`ansible-galaxy` encounters a 429 or 520 http code and exits.
```


### Code of Conduct

I agree to follow the Ansible Code of Conduct


mock_open = MagicMock()
    mock_open.side_effect = return_response
    monkeypatch.setattr(galaxy_api, 'open_url', mock_open)
    mock_display = MagicMock()
    monkeypatch.setattr(Display, 'display', mock_display)
    mock_vvv = MagicMock()
    monkeypatch.setattr(Display, 'vvv', mock_vvv)
    monkeypatch.setattr(time, 'sleep', MagicMock())
    expected = "Timeout while waiting for the Galaxy import process to finish, check progress at '%s'" % full_import_uri
    with pytest.raises(AnsibleError, match=expected):
        api.wait_import_task(import_uri, 1)
    assert mock_open.call_count > 1
    assert mock_open.mock_calls[0][1 full_import_uri
    assert mock_open.mock_calls[0][2]['headers']['Authorization'] == '%s my token' % token_type
    assert mock_open.mock_calls[1][1 full_import_uri
    assert mock_open.mock_calls[1][2]['headers']['Authorization'] == '%s my token' % token_type
    assert mock_display.call_count == 1
    assert mock_display.mock_calls[0][1 'Waiting until Galaxy import task %s has completed' % full_import_uri
    # expected_wait_msg = 'Galaxy import process has a status of waiting, wait {0} seconds before trying again'
    assert mock_vvv.call_count > 9  # 1st is opening Galaxy token file.
    # FIXME:
    # assert mock_vvv.mock_calls[1][1 expected_wait_msg.format(2)
    # assert mock_vvv.mock_calls[2][1 expected_wait_msg.format(3)
    # assert mock_vvv.mock_calls[3][1 expected_wait_msg.format(4)
    # assert mock_vvv.mock_calls[4][1 expected_wait_msg.format(6)
    # assert mock_vvv.mock_calls[5][1 expected_wait_msg.format(10)
    # assert mock_vvv.mock_calls[6][1 expected_wait_msg.format(15)
    # assert mock_vvv.mock_calls[7][1 expected_wait_msg.format(22)
    # assert mock_vvv.mock_calls[8][1 expected_wait_msg.format(30)
@pytest.mark.parametrize('api_version, token_type, version, token_ins', [