Support uploading NeMo models to HF via `push_to_hf_hub()`
jenkins jenkins jenkins
# What does this PR do ?

Adds the ability to upload NeMo models to Huggingface, and restore NeMo models from unpacked HF directory.

**Collection**: [Core]

# Changelog 
- Support upload to HF via `push_to_hf_hub()` in Model/ModelPT
- Support uploading single .nemo file or full folder of unpacked nemo file. Full folder is useful for LLMs where the single nemo file is larger than HF upload limit of 10 GB per uploaded object.
- Support restoring unpacked NeMo file when downloading from Huggingface hub

# Usage

## Upload loaded model
```python

token = "<HF TOKEN>" or None
pack_nemo_file = True  # False uploads multiple files that comprise the NeMo file onto HF Hub; Easier for LLMs 

model.push_to_hf_hub(
   repo_id=repo_id, pack_nemo_file=True, token=token,
)
```

## Supports most HF Upload arguments such as private upload

```python
model.push_to_hf_hub(
    repo_id=repo_id, pack_nemo_file=False, token=token, private=True
)
```

## Modify model card with helpers
```python

template = """ <Your own custom template> 
# {model_name}
"""
kwargs = {"model_name": "ABC", "repo_id": "nvidia/ABC_XYZ"}
model_card = model.generate_model_card(template=template, template_kwargs=kwargs, type="hf")

model.push_to_hf_hub(
    repo_id=repo_id, token=token, model_card=model_card
)
```

## Modify model card with custom class
```python
class MyModelCard:
  def __init__(self, model_name):
    self.model_name = model_name

  def __repr__(self):
    template = """
This is the {model_name} model
""".format(model_name=self.model_name)
    return template

model.push_to_hf_hub(
    repo_id=repo_id, token=token, model_card=MyModelCard("ABC")
)
```

# Jenkins CI
To run Jenkins, a NeMo User with write access must comment `jenkins` on the PR.

# Before your PR is "Ready for review"
**Pre checks**:
- [x] 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**:
- [x] New Feature
- [ ] Bugfix
- [ ] Documentation

If you haven't finished some of the above items you can still open "Draft" PR.

