Introduce pre-commit with pre-commit suggestions
# What does this PR do?

Currently style checking is done within the `setup.py` and enforced via jenkins.

This is problematic for users who do not have jenkins access and builds fail due to simple style fixes. By using pre-commit CI, we can automate style fixes in PRs meaning less work for users (and have a dedicate CI job for this).

As a side effect of this, due to the old version of black running I had to upgrade the Black version from the pre-release (19) to a stable version (22.*). Due to this there has been some additional style changes. A few summarized below:

- Lots of whitespace removed
- Multiple argument functions are expanded based on length. this is primarily for readability (and hence why the number of lines go up):

i.e 
```python
# old
{'label': NeuralType(tuple('B'), LabelsType()), 'label_length': NeuralType(tuple('B'), LengthsType()),}

# new
{
    'label': NeuralType(tuple('B'), LabelsType()),
    'label_length': NeuralType(tuple('B'), LengthsType()),
}
``` 

# Changelog 
- Introduce pre-commit, update Black version.

# Before your PR is "Ready for review"
**Pre checks**:
- [ ] Make sure you read and followed [Contributor guidelines](https://github.com/NVIDIA/NeMo/blob/main/CONTRIBUTING.md)
- [ ] Did you write any new necessary tests?
- [ ] Did you add or update any necessary documentation?
- [ ] Does the PR affect components that are optional to install? (Ex: Numba, Pynini, Apex etc)
  - [ ] Reviewer: Does the PR have correct import guards for all optional libraries?
  
**PR Type**:
- [ ] New Feature
- [ ] Bugfix
- [ ] Documentation