Megatron encoder-decoder refactor
This PR refactor Megatron T5 to a modular base encoder-decoder class hierarchy, and a T5 class which customizes the base class. The goal of the refactor is to support multiple encoder-decoder models with minimal code redundancy. 

# Refactor High Level Description

Hierarchy tree is expressed below via list alignment (i.e., right alignment for child class).

* `MegatronModule` sub-classes:
	* `MegatronTransformerEncoderModule`/`MegatronTransformerDecoderModule` - various architectures for manipulation of hidden --> hidden
	* `MegatronTransformerEncoderDecoderModule` - contains above classes and generates required joint encoder/decoder mask given independent masks, and reparametrization (e.g., vae)
	* `TokensEncoderDecoderModule` - modality-specific (e.g., tokens-tokens) model which map between pre-processed data (e.g., token ids) and encoder/decoder continuous input (i.e., hidden); handles embedders (i.e., embedding + positional embedding); handles projection from hidden to data distribution (e.g., project from hidden dimensions to the number of tokens)
* `NLPModel` sub-classes:
	* `MegatronBaseModel` - common initialization of Megatron
		* `MegatronLMEncoderDecoderModel` - modality-specific (e.g., text-text) model which pre-process raw data (e.g., tokenizer pre-process text to token ids); generic modality-specific training/testing/inference/loss methods
			* `MegatronT5Model` - a specific model (i.e., T5) which prepares datasets (i.e., with corresponding data augmentation), and model-specific features (e.g., sentinels in tokenizer)

# Notable Changes

1. Encoder/decoder mask is 2D with `1` for active element, and `0` for masked element (i.e., as opposed to 3D Megatron  mask with `False` for active and `True` for masked). This allows easy manipulation of masks. Conversion to 3D Megatron masks is done on-the-fly.
2. Joint cross-attention mask is not precomputed, but is rather done on-the-fly.