[WIP] GPT Neo cleanup
# What does this PR do?

This PR refactors the `GPTNeoLocalSelfAttention` layer and adds more tests for it.

This PR
- adds the `AttentionMixin` class which contains the shared utilities for both global and local attention. The class is meant to be used as a mixin and makes it easy to test it.
- the `look_around` method is now replaced by the `AttentionMixin._look_back` method, which is now vectorized and can give up to 300x speed-up compared to old `look_around`
- The `GPTNeoLocalSelfAttention._create_attention_mask`  is now simplified and is also giving nice speed-up as it uses `_look_back`. I've added more detailed comments to explain the mask creation logic.
- I've added multiple shape checks in the  `AttentionMixin` to make it as robust as possible.

I didn't do a thorough benchmarking but I'm observing around ~3.9x speed-up when generating sequences of length 1024.

Verified that all slow-tets are passing.
As explained in https://github.com/huggingface/transformers/issues/11076#issuecomment-814218202, the loss did decrease over time on this small sample so it looks like there are no regressions w.r.t training.

~Merge when ready @patil-suraj.~ :point_down: <|||||>It seems I'm not passing the slow tests locally, `test_gpt_neo_sample` fails with:

```
AssertionError: 'Today is a nice day and a wonderful time to be in Rome, though the sun won’' != 'Today is a nice day and if you don’t get the memo here is what you can'
- Today is a nice day and a wonderful time to be in Rome, though the sun won’
+ Today is a nice day and if you don’t get the memo here is what you can
```<|||||>As seen with @patil-suraj, this is due to a wrongly initialized seed; and the other tests ensure that we have a correct attention mask and generation. Merging!