Tokenizers API developments
Author: thomwolf
Pull request: yes

Some developments on the tokenizer's API to make it more flexible and easy to use for dynamic/uniform size batching.

- add `return_lengths` methods to both slow and fast tokenizer to have a column with input lengths (useful to sort them afterward)
- make `tokenizer.pad()` accept a list of dicts so it can be used as a `collate_fn` in a PyTorch data loader.
- safety check that all the `kwargs` inputs to encoding methods are recognized (avoid silent errors). raise a warning if not, not an error for now (reduce breaking change behaviors).
- standardized arguments of the encoding methods in unified names (`return_attention_masks` => `return_attention_mask` and `return_special_tokens_masks` => `return_special_tokens_mask`). This is a slight breaking change but even the maintainers of the lib were actually making the confusion as well (which usually resulted in silent error hidden behind the above mentioned generic use of kwargs in encoding errors).
- use the `tokenizers` library `AddedToken` class to control more finely how added (and special) tokens are tokenized (do we tokenize them inside words, do we strip left and/or right white spaces around them). This class gives a simpler and cleaner behavior for `RobertaTokenizer`.
- change the way special tokens can be added to the tokenizers. We now have more separated paths:

   * giving a string at tokenizer initialization or setting an attribute (e.g. `tokenizer.mask_token`) update the relevant attribute in the tokenizer class but doesn't add tokens in the vocabulary. We do that because the initialization of the special tokens is usually done before the backend vocabulary is setup. This automatic and non explicit addition of tokens can also be error-prone and a source of silent-errors.
   * the recommended way to add a token and use it as a special token is to use `add_special_tokens` which will store the attribute AND add the token to the vocabulary if needed and which returns the number of added tokens
   * a new method `tokenizer.sanitize_special_tokens()` can be used to make sure all the special tokens are in the vocabulary and to automatically add them if it's not the case.

This PR should in particular fix cleanly the Roberta specific behavior discussed in:
- https://github.com/huggingface/transformers/pull/2778
- https://github.com/huggingface/transformers/issues/3788

Roberta now behave like GPT2, i.e. without a prefix token. It can still be used in the masked-fill pipeline since with can control the behavior of the mask token with the parameters of `AddedToken` and in particular keep a space after the mask token as required to use the pipeline correctly.

Comments:
# [Codecov](https://codecov.io/gh/huggingface/transformers/pull/5103?src=pr&el=h1) Report
> Merging [#5103](https://codecov.io/gh/huggingface/transformers/pull/5103?src=pr&el=desc) into [master](https://codecov.io/gh/huggingface/transformers/commit/417e492f1e832c0b93512600d3385aa4c8a887c9&el=desc) will **decrease** coverage by `0.89%`.
> The diff coverage is `87.26%`.

[![Impacted file tree graph](https://codecov.io/gh/huggingface/transformers/pull/5103/graphs/tree.svg?width=650&height=150&src=pr&token=9qOlN6Hb1c)](https://codecov.io/gh/huggingface/transformers/pull/5103?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master    #5103      +/-   ##
==========================================
- Coverage   77.98%   77.09%   -0.90%     
==========================================
  Files         138      138              
  Lines       23786    23836      +50     
==========================================
- Hits        18550    18376     -174     
- Misses       5236     5460     +224     
```


| [Impacted Files](https://codecov.io/gh/huggingface/transformers/pull/5103?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [src/transformers/tokenization\_utils.py](https://codecov.io/gh/huggingface/transformers/pull/5103/diff?src=pr&el=tree#diff-c3JjL3RyYW5zZm9ybWVycy90b2tlbml6YXRpb25fdXRpbHMucHk=) | `91.48% <78.78%> (-3.34%)` | :arrow_down: |
| [src/transformers/tokenization\_utils\_fast.py](https://codecov.io/gh/huggingface/transformers/pull/5103/diff?src=pr&el=tree#diff-c3JjL3RyYW5zZm9ybWVycy90b2tlbml6YXRpb25fdXRpbHNfZmFzdC5weQ==) | `91.97% <85.71%> (-0.63%)` | :arrow_down: |
| [src/transformers/tokenization\_utils\_base.py](https://codecov.io/gh/huggingface/transformers/pull/5103/diff?src=pr&el=tree#diff-c3JjL3RyYW5zZm9ybWVycy90b2tlbml6YXRpb25fdXRpbHNfYmFzZS5weQ==) | `90.86% <91.93%> (-0.21%)` | :arrow_down: |
| [src/transformers/tokenization\_bert.py](https://codecov.io/gh/huggingface/transformers/pull/5103/diff?src=pr&el=tree#diff-c3JjL3RyYW5zZm9ybWVycy90b2tlbml6YXRpb25fYmVydC5weQ==) | `89.95% <100.00%> (-0.51%)` | :arrow_down: |
| [src/transformers/tokenization\_gpt2.py](https://codecov.io/gh/huggingface/transformers/pull/5103/diff?src=pr&el=tree#diff-c3JjL3RyYW5zZm9ybWVycy90b2tlbml6YXRpb25fZ3B0Mi5weQ==) | `97.12% <100.00%> (+0.04%)` | :arrow_up: |
| [src/transformers/tokenization\_roberta.py](https://codecov.io/gh/huggingface/transformers/pull/5103/diff?src=pr&el=tree#diff-c3JjL3RyYW5zZm9ybWVycy90b2tlbml6YXRpb25fcm9iZXJ0YS5weQ==) | `94.52% <100.00%> (ø)` | |
| [src/transformers/tokenization\_transfo\_xl.py](https://codecov.io/gh/huggingface/transformers/pull/5103/diff?src=pr&el=tree#diff-c3JjL3RyYW5zZm9ybWVycy90b2tlbml6YXRpb25fdHJhbnNmb194bC5weQ==) | `42.48% <100.00%> (+0.13%)` | :arrow_up: |
| [src/transformers/modeling\_tf\_openai.py](https://codecov.io/gh/huggingface/transformers/pull/5103/diff?src=pr&el=tree#diff-c3JjL3RyYW5zZm9ybWVycy9tb2RlbGluZ190Zl9vcGVuYWkucHk=) | `19.92% <0.00%> (-75.00%)` | :arrow_down: |
| [src/transformers/modeling\_tf\_utils.py](https://codecov.io/gh/huggingface/transformers/pull/5103/diff?src=pr&el=tree#diff-c3JjL3RyYW5zZm9ybWVycy9tb2RlbGluZ190Zl91dGlscy5weQ==) | `85.86% <0.00%> (-0.15%)` | :arrow_down: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/huggingface/transformers/pull/5103?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/huggingface/transformers/pull/5103?src=pr&el=footer). Last update [417e492...ca291b5](https://codecov.io/gh/huggingface/transformers/pull/5103?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).