Transformers fast import part 2
# What does this PR do?

This is the second test to allow a fast import of transformers by deferring the imports of dependencies when they are actually needed (almost but not quite, see below). It results in the line `import transformers` running in 239ms instead of 2.3s, so quite a nice speedup.

To do this, the main init is changed to have a bid private dictionary that maps modules names to public object names instead of directly importing those objects. A submodule or object is then only imported when explicitly requested, which means the line `import transformers` by itself doesn't import any of the dependencies.

This mechanism is incompatible with absolute imports inside the library, hence the big diff as I had to change quite a few `from transformers.xxx import yyy` to `from .xxx import yyy`.

Also, this misses the last piece to be completely efficient: the intermediate init (in models) should use the mechanism to avoid importing TensorFlow when we only request a PyTorch model. This will be done in another PR as this one is already quite big by itself.

The script that created the dummy objects needed some update because it used to parse the init. I took this opportunity to also refactor the dupe code. Obviously the templates also needed an update.

The rework of the init also makes it important to have the intermediate init of `models` be nonempty, otherwise things like
```
import transformers
auto_module = transformers.model.auto
```
will break. I don't think this is a big inconvenience (especially since the update template will fill this for the user).
Just followed a bug back to this PR, wanted to send a message here since it seemed relevant to ping @sgugger 

The check for version in file_utils.py:
`if version.parse(sys.version) < version.parse("3.8"):` doesn't seem to be reliable for me (or on multiple machines and images I have)

Specifically: 
```
Python 3.8.5 (default, Aug  6 2020, 14:13:36) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> from packaging import version
>>> sys.version
'3.8.5 (default, Aug  6 2020, 14:13:36) \n[GCC 9.3.0]'
>>> version.parse("3.8.5")
<Version('3.8.5')>
>>> version.parse("3.8.5") < version.parse("3.8")  # expect false
False
>>> version.parse(sys.version) < version.parse("3.8")  # expect false
True
```

Instead, it seems more reliable/functional to not rely on `packaging.version` at all and instead do `sys.version_info < (3, 8)`.

I can also put in an Issue if that's a more appropriate way to raise / flag a concern. Just thought i'd ping here since i was able to trace it back to this PR from today. <|||||>Oh, thanks for reporting! Will add this to #9474 which should be merged tomorrow.