### Summary

Our setuptools constrain in `pyproject.toml` (listed also in `setup.cfg`) is set to `>= 39.2.0` due to the minimum version available at the time on Ubuntu 18.04.

Now that we have a dependency on Python 3.9 as a minimum, that constraint no longer makes sense, as Python 3.9 is not available on 18.04, and the `dist-packages` `setuptools==39.2.0` compat between deadsnakes python3.9 is non-functional.

This would make Ubuntu 20.04 effectively the minimum supported controller.  The `dist-packages` `setuptools==45.2.0` is functional with the `python3.9` package, and works fine with our packaging.  

This doesn't really grant us anything, since we're waiting for the minimum to eventually be `51.0.0` so we can list the `entry_points` in `pyproject.toml`, but no need to list effectively a non-functional lower bounds. 

### Issue Type

Feature Idea

### Component Name

pyproject.toml

### Additional Information

<!--- Paste example playbooks or commands between quotes below -->
```yaml (paste below)

```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
name: str
    requirements_path: pathlib.Path
    source_path: pathlib.Path
    def freeze_requirements(self) -> None:
        with tempfile.TemporaryDirectory() as venv_dir:
            venv.create(venv_dir, with_pip=True)
            python = pathlib.Path(venv_dir, 'bin', 'python')
            pip = [python, '-m', 'pip', '--disable-pip-version-check']
            env = dict()
            pip_freeze = subprocess.run(pip + ['freeze'], env=env, check=True, capture_output=True, text=True)
            if pip_freeze.stdout:
                raise Exception(f'Initial virtual environment is not empty:\n{pip_freeze.stdout}')
            subprocess.run(pip + ['install', 'wheel'], env=env, check=True)  
            subprocess.run(pip + ['install', '-r', self.source_path], env=env, check=True)
            pip_freeze = subprocess.run(pip + ['freeze'], env=env, check=True, capture_output=True, text=True)
        requirements = f'# edit "{self.source_path.name}" and generate with: {SELF} --test {self.name}\n{pip_freeze.stdout}'
        with open(self.requirements_path, 'w') as requirement_file:
            requirement_file.write(requirements)
    @staticmethod
    def create(path: pathlib.Path) -> SanityTest:
        return SanityTest(
            name=path.stem.replace('sanity.', '').replace('.requirements', ''),
            requirements_path=path,
            source_path=path.with_suffix('.in'),
        )
def main() -> None: