Support NeMo Forced Aligner for several hours of audio
# What does this PR do ?

Add CPU offloading and memory tricks to let NFA work for up to 2 hours of audio via offloading

**Collection**: [Tools, ASR]

# Changelog 
- Add granular CPU offloading of tensors 
- Replace all repeat with expand to prevent unnecessarily allocating memory
- Add support for local attention

# Usage

```python

python align.py \
    model_path=<Citrinet model path> \
    model_downsample_factor=8 \
    manifest_filepath=<Manifest filepath> \
    transcribe_device='cuda' \
    viterbi_device='cpu' \
    batch_size=1 \
    transcribe_dtype="fp16" \  # bf16 if supported
    transcribe_amp=true \
    viterbi_dtype="fp16" \  # CPU offload supports fp16 everywhere
    cpu_offload_transcript_probs=True \
    cpu_offload_viterbi_probs=True \
    cpu_offload_viterbi_pointers=True \
    model_change.conformer.self_attention_model="rel_pos_local_attn" \  # Support Conformer (medium length audio) with local attention
    model_change.conformer.att_context_size=[64,64]

```

# 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?
- [x] 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
