Punctuation data set uses too much memory
**Describe the bug**

Punctuation datasets cannot be constructed with more than a few million examples (depending on the max length). Even these small datasets can consume a huge amount of memory while preprocessing (100's of GB) and while training (10's of GB per process). 

This issue was mentioned in passing in https://github.com/NVIDIA/NeMo/issues/2569 though it was not the main issue discussed there and thus not fixed.

Assuming it is an acceptable idea to load the entire dataset into memory in the first place, these are the points where there seems to be an excessive use of memory.

The function with issues (`get_features`):
https://github.com/NVIDIA/NeMo/blob/main/nemo/collections/nlp/data/token_classification/punctuation_capitalization_dataset.py#L34 

The main issues:
1. Why save `all_segment_ids`? It appears there is nowhere this is set to anything but a constant 0. `__getitem__` can deal with it.
2. Why pad to the max length? `collate_fn` can deal with that, and could do so much more efficiently (by only padding to the max length of the batch).
3. Loss mask and input mask can be generated by `__getitem__` or `collate_fn`
4. Subtokens mask could be generated later as well, albeit not trivially.


**Expected behavior**

Should be able to use a dataset with 10's of millions of lines.
