Add defensive check for config num_labels and id2label
# What does this PR do?

As seen in #16600, there can be some unclear errors when the user tries to pass together an inconsistent `num_labels` and `id2label`. This PR addresses that with a clear error message.
_The documentation is not available anymore as the PR was closed or merged._<|||||>Might I suggest to add an example in the error message? Especially for regression where num_labels=1, it might not be obvious to users what the id2label map has to look like. Suggestion:

```
f"You passed along `num_labels={kwargs['num_labels']}` with an incompatible ID to label map:
{kwargs['id2label']}. The id2label map should be a dictionary of ID (int) to label (str). E.g., for
num_labels=1 (regression), it should look like this: {0: "LABEL_0"},
even if you do not have any explicitly labelled data."
```<|||||>I really don't understand why you want to pass both, as setting `num_labels=1` will do exactly that.<|||||>> I really don't understand why you want to pass both, as setting `num_labels=1` will do exactly that.

Exactly, but this comes back to the original issue that I posted. Passing num_labels=1, id2label=None causes issues, because id2label=None overwrites the generated id2label map. So the only thing that works is:

```python
config = BertConfig.from_pretrained(model_name_or_path, num_labels=1, id2label=None)
config.num_labels = num_labels
```

or 

```python
config = BertConfig.from_pretrained(model_name_or_path, num_labels=1, id2label={0: "LABEL_0"})
```

Yet it is not obvious why

```python
config = BertConfig.from_pretrained(model_name_or_path, num_labels=1, id2label=None)
```

doesn't work even though you don't strictly need labels for a regression problem, and even though id2label=None is the default argument.

And yes, I am aware that _most users_ will not encounter this issue because they will not explicitly pass id2label=None, but that does not mean that it cannot happen. And if it does it should be made obvious to the user why something goes wrong. I often write code for different use-cases, and as my issue showed, you will encounter this issue if you need to write code for different num_labels/tasks dynamically. If users are not expected to write code like that, it doesn't hurt to tell them in the error message how they should write their code instead. 

You are right though that my message seemed to imply that they _have_ to provide an id2label map. Suggestion:

f"You passed along `num_labels={kwargs['num_labels']}` with an incompatible ID to label map:
{kwargs['id2label']}. If given (not required), the id2label map should be a dictionary of ID (int)
to label (str). Note that explicitly setting id2label to None may lead to unexpected errors. 
Instead, do not pass the id2label argument at all or pass a dummy id2label with the same len 
as num_labels."<|||||>I adapted the error message slightly to insist on removing one of the incompatible kwarg.