[WIP] Refactor Tokenizers creation to support in-memory initialization
As pointed out in #916 currently tokenizers ask for the path from where they'll load the required vocabulary files.

This PR allows tokenizers to take their vocab from data living in-memory and cold-storage.

Implementations details:

- All tokenizer now have a specific ${TokenizerName}Vocab dataclass holding all the required information to run the model.
- All ${TokenizerName}Vocab dataclass provide a from_pretrained method in charge of reading necessary files 
- All tokenizer now take as first argument vocabs which has to ${TokenizerName}Vocab instance. 
- All model now have a static member vocab_class which points to the desired ${TokenizerName}Vocab data class 

- Some ${TokenizerName}Vocab.from_pretrained share loading routines and thus code is currently duplicated across all of them. It might be possible to refactor to use a generic method that handles such loading. 

- [x] Bert
- [x] Transformer XL
- [x] GPT
- [x] GPT-2
- [x] XLNet
- [x] XLM
- [x] RoBERTa
- [x] DistilBERT
@thomwolf cc @honnibal Drafting this PR to have dedicated space for discussions.<|||||>@thomwolf @honnibal Can you have a look plz :) ?<|||||>Ok, I went through this PR and it looks nice.
Great job @mfuntowicz.
No problem for the slight code duplication in the tokenizer loading classes, as you've noticed, the repo's philosophy is rather pragmatic and we only add abstractions when they are needed for easier code maintenance and added functionalities.
Thanks for following the general organization of the repo as well.<|||||>This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.
