Implement some Python best practices
Improve source code quality with black, isort & flake8.
This is in reasonably good shape. There are two tasks left:

1. Figure out why isort doesn't behave the same locally and on Circle CI. Most likely this has to do with how it classifies first-party / third-party / unknown libraries. Then enable it on Circle CI. **EDIT - fixed** - this was a matter of installing optional dependencies, not listed in setup.py, on Circle CI so that isort can classify them correctly.
2. Fix flake8 F841 warnings and stop ignoring them.

Assuming tests pass, I think it would be best to merge this PR and deal with these two items later. I'd like to do the repository structure changes first, so we're done with the large changes.<|||||># [Codecov](https://codecov.io/gh/huggingface/transformers/pull/2255?src=pr&el=h1) Report
> Merging [#2255](https://codecov.io/gh/huggingface/transformers/pull/2255?src=pr&el=desc) into [master](https://codecov.io/gh/huggingface/transformers/commit/645713e2cb8307e41febb2b7c9f6036f6645efce?src=pr&el=desc) will **decrease** coverage by `0.24%`.
> The diff coverage is `44.23%`.

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

```diff
@@            Coverage Diff             @@
##           master    #2255      +/-   ##
==========================================
- Coverage   78.35%   78.11%   -0.25%     
==========================================
  Files         133      133              
  Lines       19878    19655     -223     
==========================================
- Hits        15576    15354     -222     
+ Misses       4302     4301       -1
```


| [Impacted Files](https://codecov.io/gh/huggingface/transformers/pull/2255?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [transformers/modeling\_tf\_xlm.py](https://codecov.io/gh/huggingface/transformers/pull/2255/diff?src=pr&el=tree#diff-dHJhbnNmb3JtZXJzL21vZGVsaW5nX3RmX3hsbS5weQ==) | `90.44% <ø> (-0.04%)` | :arrow_down: |
| [transformers/configuration\_xlnet.py](https://codecov.io/gh/huggingface/transformers/pull/2255/diff?src=pr&el=tree#diff-dHJhbnNmb3JtZXJzL2NvbmZpZ3VyYXRpb25feGxuZXQucHk=) | `93.47% <ø> (-0.4%)` | :arrow_down: |
| [transformers/modeling\_mmbt.py](https://codecov.io/gh/huggingface/transformers/pull/2255/diff?src=pr&el=tree#diff-dHJhbnNmb3JtZXJzL21vZGVsaW5nX21tYnQucHk=) | `18.25% <ø> (ø)` | :arrow_up: |
| [transformers/modelcard.py](https://codecov.io/gh/huggingface/transformers/pull/2255/diff?src=pr&el=tree#diff-dHJhbnNmb3JtZXJzL21vZGVsY2FyZC5weQ==) | `87.8% <ø> (ø)` | :arrow_up: |
| [transformers/tests/modeling\_bert\_test.py](https://codecov.io/gh/huggingface/transformers/pull/2255/diff?src=pr&el=tree#diff-dHJhbnNmb3JtZXJzL3Rlc3RzL21vZGVsaW5nX2JlcnRfdGVzdC5weQ==) | `98% <ø> (-0.02%)` | :arrow_down: |
| [transformers/modeling\_tf\_roberta.py](https://codecov.io/gh/huggingface/transformers/pull/2255/diff?src=pr&el=tree#diff-dHJhbnNmb3JtZXJzL21vZGVsaW5nX3RmX3JvYmVydGEucHk=) | `90.9% <ø> (ø)` | :arrow_up: |
| [transformers/tests/modeling\_tf\_ctrl\_test.py](https://codecov.io/gh/huggingface/transformers/pull/2255/diff?src=pr&el=tree#diff-dHJhbnNmb3JtZXJzL3Rlc3RzL21vZGVsaW5nX3RmX2N0cmxfdGVzdC5weQ==) | `95.74% <ø> (-0.18%)` | :arrow_down: |
| [transformers/configuration\_openai.py](https://codecov.io/gh/huggingface/transformers/pull/2255/diff?src=pr&el=tree#diff-dHJhbnNmb3JtZXJzL2NvbmZpZ3VyYXRpb25fb3BlbmFpLnB5) | `97.22% <ø> (-0.22%)` | :arrow_down: |
| [transformers/tests/tokenization\_xlm\_test.py](https://codecov.io/gh/huggingface/transformers/pull/2255/diff?src=pr&el=tree#diff-dHJhbnNmb3JtZXJzL3Rlc3RzL3Rva2VuaXphdGlvbl94bG1fdGVzdC5weQ==) | `82.22% <ø> (ø)` | :arrow_up: |
| [transformers/commands/\_\_init\_\_.py](https://codecov.io/gh/huggingface/transformers/pull/2255/diff?src=pr&el=tree#diff-dHJhbnNmb3JtZXJzL2NvbW1hbmRzL19faW5pdF9fLnB5) | `0% <ø> (ø)` | :arrow_up: |
| ... and [237 more](https://codecov.io/gh/huggingface/transformers/pull/2255/diff?src=pr&el=tree-more) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/huggingface/transformers/pull/2255?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/2255?src=pr&el=footer). Last update [645713e...c11b3e2](https://codecov.io/gh/huggingface/transformers/pull/2255?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).
<|||||>`pyproject.toml` is supposed to be The Future (tm). `setup.cfg`was supposed to be The Future as well. That didn't quite work, but it gained some support.

Unfortunately, in the Python packaging ecosystem, some futures never became the present. That's why I'm conservative, at least until this changes: https://packaging.python.org/specifications/distribution-formats/

I'm happy to try converting setup.py to pyproject.toml if you're feeling adventurous. Let me know.

We can move the isort configuration there, but not the flake8 configuration until [this PR](https://gitlab.com/pycqa/flake8/issues/428) is merged. I like setup.cfg because we can put both in the same file.<|||||>Alright thanks for the context!