A cleaner and more scalable implementation of symbolic tracing
# What does this PR do?

This PR provides a much cleaner and less hacky implementation of symbolic tracing for models of the library.
It also provides support for more architectures:

- ALBERT
- DistilBERT
- MobileBERT
- MegatronBERT
- GPT2
- GPT Neo

What do you think about `dtype` being hardcoded?

While this is OK for now hardcoding dtype might be an issue down the road. For most NLP models inputs are int, but for example for wav2vec2 they are floats. 

And would this have an impact if the final usage is in fp16 for where you used `float`.

We can't derive the dtype from the model in this context. 

Thoughts?

This is not a showstopper to merge this, but just something to consider - I'm sure we will cross the bridge if we encounter it.