Fx with meta
# What does this PR do?

This PR simplies and improves the way tracing works with torch.fx.

Instead of recording concrete values via a forward pass on the original model, metadata is attached to the proxies, either tensors on the `meta` device (which saves us from making actual computations, only shape inference is performed) or any other type such as `torch.Size` and builtin types. On top of allowing to trace very big models, this gives much more flexibility and should allow to support many new architectures.

A big thanks to @jamesr66a as he was the one who provided the basis for tracing with meta tensors, and I simply extended what was already done to our purposes.

@jamesr66a @pbelevich I would love your review and feedbacks!

_The documentation is not available anymore as the PR was closed or merged._<|||||>@sgugger is it ready now?<|||||>Since it does not change the API, and does not provide any new feature, the current set of test is enough.
I also ran the test with `torch=1.10.2` (we have `TORCH_FX_REQUIRED_VERSION = version.parse("1.10")`), and they pass. The torch version could have been a limitation since we use the meta device, but everything is okay.