[QOL] PretrainedConfig.to_diff_dict(other_config)
This PR allows users to compare two configs in a backwards compatible way. 
### Solution
The following calls work:
```python
bart_large_config = BartConfig.from_pretrained('facebook/bart-large')
bart_base_config = BartConfig.from_pretrained('facebook/bart-base')
t5_config = T5Config.from_pretrained('t5-small')
bart_large_config.to_diff_dict() # unchanged
bart_large_config.to_diff_dict(bart_base_config) # compares configs
bart_large_config.to_diff_dict(t5_config) # can be across subtypes
bart_large_config.to_diff_dict(bart_base_config.to_dict()) # can be against dict
```

Adds test that outputs are reasonable.
### Problem
Current best way to compare configs is to define your own function. Here is the one I use. Also good for debugging conversion scripts:

```python
def dct_differences(dct_a, dct_b):
    SENTINEL = '__MissingKey'
    k1, k2 = set(dct_a), set(dct_b) # just the keys
    deltas = []
    for k in k1.union(k2):
        vala, valb = dct_a.get(k, SENTINEL), dct_b.get(k, SENTINEL)
        # TODO(SS): nested dicts? Maybe better to dump to json and compare (after sorting keys!)
        if vala == valb:
            if (vala == SENTINEL and valb == SENTINEL): raise AssertionError('Adversarial Sentinel Input!')
        else:
            deltas.append((k, vala, valb))
    return deltas
bart_large_config = BartConfig.from_pretrained('facebook/bart-large')
bart_base_config = BartConfig.from_pretrained('facebook/bart-base')
delta =  dct_differences(bart_large_config.to_dict(), bart_base_config.to_dict())
```
this implementation is almost as useful without breaking backwards compatibility.
Didn't work. Will re-open when I have something better.