Added cleaned configuration properties for tokenizer with serialization - improve tokenization of XLM
Author: shijie-wu
Pull request: yes

This PR improve the tokenization of XLM. It's mostly the same as the [preprocessing](https://github.com/facebookresearch/XLM/blob/master/tools/tokenize.sh) in the original XLM. This PR also add `use_lang_emb` to config of XLM model, which makes adding the newly release [XLM-17 & XLM-100](https://github.com/facebookresearch/XLM#pretrained-cross-lingual-language-models) easier since both of them don't have language embedding.

Details on tokenization:
- Introduce API change: Changing `XLMTokenizer.tokenize(self, text)` to  `XLMTokenizer.tokenize(text, lang='en')`
- New dependency:
  - [sacremoses](https://github.com/alvations/sacremoses): port of Moses
- New optional dependencies:
  - [pythainlp](https://github.com/PyThaiNLP/pythainlp): Thai tokenizer
  - [kytea](https://github.com/chezou/Mykytea-python): Japanese tokenizer, wrapper of [KyTea](https://github.com/neubig/kytea) (Need external C++ compilation), used by the newly release XLM-17 & XLM-100
  - [jieba](https://github.com/fxsjy/jieba): Chinese tokenizer *

\* XLM used Stanford Segmenter. However, the wrapper (`nltk.tokenize.stanford_segmenter`) are slow due to JVM overhead, and it will be deprecated. Jieba is a lot faster and pip-installable. But there is some mismatch with the Stanford Segmenter. A workaround could be having an argument to allow users to segment the sentence by themselves and bypass the segmenter. As a reference, I also include `nltk.tokenize.stanford_segmenter` in this PR.

Example of tokenization difference could be found [here](https://colab.research.google.com/drive/1nY930H2dhz3IlFvDgU9ycgfm2-DpvRcT).

Comments:
# [Codecov](https://codecov.io/gh/huggingface/pytorch-transformers/pull/1092?src=pr&el=h1) Report
> Merging [#1092](https://codecov.io/gh/huggingface/pytorch-transformers/pull/1092?src=pr&el=desc) into [master](https://codecov.io/gh/huggingface/pytorch-transformers/commit/df9d6effae43e92761eb92540bc45fac846789ee?src=pr&el=desc) will **increase** coverage by `0.09%`.
> The diff coverage is `78.2%`.

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

```diff
@@            Coverage Diff             @@
##           master    #1092      +/-   ##
==========================================
+ Coverage   79.61%   79.71%   +0.09%     
==========================================
  Files          42       42              
  Lines        6898     7010     +112     
==========================================
+ Hits         5492     5588      +96     
- Misses       1406     1422      +16
```


| [Impacted Files](https://codecov.io/gh/huggingface/pytorch-transformers/pull/1092?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pytorch\_transformers/modeling\_xlm.py](https://codecov.io/gh/huggingface/pytorch-transformers/pull/1092/diff?src=pr&el=tree#diff-cHl0b3JjaF90cmFuc2Zvcm1lcnMvbW9kZWxpbmdfeGxtLnB5) | `86.73% <100%> (+0.07%)` | :arrow_up: |
| [pytorch\_transformers/tokenization\_bert.py](https://codecov.io/gh/huggingface/pytorch-transformers/pull/1092/diff?src=pr&el=tree#diff-cHl0b3JjaF90cmFuc2Zvcm1lcnMvdG9rZW5pemF0aW9uX2JlcnQucHk=) | `95.63% <100%> (+0.79%)` | :arrow_up: |
| [pytorch\_transformers/tokenization\_utils.py](https://codecov.io/gh/huggingface/pytorch-transformers/pull/1092/diff?src=pr&el=tree#diff-cHl0b3JjaF90cmFuc2Zvcm1lcnMvdG9rZW5pemF0aW9uX3V0aWxzLnB5) | `86.49% <100%> (+0.26%)` | :arrow_up: |
| [pytorch\_transformers/tokenization\_xlm.py](https://codecov.io/gh/huggingface/pytorch-transformers/pull/1092/diff?src=pr&el=tree#diff-cHl0b3JjaF90cmFuc2Zvcm1lcnMvdG9rZW5pemF0aW9uX3hsbS5weQ==) | `83.4% <74.43%> (+0.33%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/huggingface/pytorch-transformers/pull/1092?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/pytorch-transformers/pull/1092?src=pr&el=footer). Last update [df9d6ef...3871b8a](https://codecov.io/gh/huggingface/pytorch-transformers/pull/1092?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Hi @shijie-wu,
So I've taken advantage of this PR to add a clean mechanism to set, save and reload tokenizer configurations.
This should fix in particular a recurring issue mentioned in #1158 and #1026 (failing to reload the lower casing configuration of the tokenizer) but more generally this is essential now for XLM's more complex language configuration.
Hope you don't mind me highjacking the PR.

Ok I think this is good to go. Let's merge it.