GPT-Neo ONNX export
# What does this PR do?

This PR enables the export of GPT-Neo to ONNX by extending the new module transformers.onnx.

It also provides a possible way of implementing the export for specific tasks: the task can be specified when instantiating an OnnxConfig. It is a nice approach because it makes factoring most of the code for the inputs / outputs very easy, but it is less aligned with transformers DNA than having subclasses (such as OnnxConfigForSequenceClassification, etc)  taking care of that.

The issue with having many subclasses is that it would have to be done everytime one wants to add the support for a model. 
What do you think?
@sgugger @LysandreJik What do you think would be the best way to approach this exporting features for downstream task? I think we have the two possible ways:

- One config per task `XOnnxConfigForY` => Follow the general "duplication" pattern in transformers
- One config with task as parameter encapsulating the logic for I/O for each possible task => Potentially reduce the LoC<|||||>I think using a `task` argument is a nice way of avoiding too many new classes which would crowd the main init of transformers.<|||||>@michaelbenayoun is the PR ready for review? 🥰 <|||||>> @michaelbenayoun is the PR ready for review?
Yes, it is!

I also implemented a "factory"  called `FeaturesManager` located  at `onnx/features.py` from what was done before by @mfuntowicz in `onnx/__main__.py` which manages the mapping between features and models / onnx configs.

From what @sgugger [said](https://github.com/huggingface/transformers/pull/12911#issuecomment-887502770), I went with the "task argument" approach. Basically, a feature is the combination of a task and the potential use of past keys and values, for instance:

- sequence-classification
- sequence-classification-with-past

Any feature containing "-with-past" will be mapped by the factory to an OnnxConfig instantiated using the `with_past` method.

@mfuntowicz any comments on the changes I have made? 