🚨🚨 Fix and simplify attention implementation dispatch and subconfigs handling
Author: Cyrilvallez
Pull request: yes

# What does this PR do?

A few issues:
- the checks and attention switch should be performed recursively for all submodels, not only the "top-most" model
- flash can dispatch even with cpu/disk offloading, as the module is put back on device prior to computation
- some models with the old class attention interface should not be allowed to switch

Because some checks need to be performed when the model is fully instantiated (i.e. params on GPU for FA2/3, presence of BetterTransformer or not), we now perform 2 checks independently: 
- first check very early, at __init__ time -> crash immediately if the attn is not supported/not installed, instead of waiting 20s to instantiate the model and then crash because a static flag is False
- full check when switching attention dynamically, as the model is then already initialized correctly

Also, when switching dynamically, let's not crash when something is not available -> a warning seem much more appropriate as otherwise we crash everything for not much. Also simplified the internal workings of the `attn_implementation` for the Configs -> removed some internal flags as they are basically useless and bloat the code a lot

🚨🚨🥵🥵 ALSO, DISCOVERED A HUGE BUG: due to deepcopy of `config` in `_from_config`, all our getter/setter when doing stuff such as `model.config.get_text_config()` would be wrong, because internal model has copied the config, which is thus not the same as the external config subconfig... This results in wrong dispatch/usage of attn_implementation everywhere we have submodels. This PR removes the deepcopy, thus fixing it -> so using `_from_config`/`from_config` is similar to `model_class(config)`, in the sense that it does not copy the config (which is better anyway, as it's more coherent). `from_pretrained` still deepcopies the config if passed
To better understand the issue at hand, consider the following:
```python
from transformers import Qwen2_5_VLForConditionalGeneration, AutoConfig

model = Qwen2_5_VLForConditionalGeneration.from_pretrained("Qwen/Qwen2.5-VL-3B-Instruct")
print(model.model.language_model.config._attn_implementation)
>>> sdpa
print(model.config.get_text_config()._attn_implementation)
>>> eager  # should be sdpa here!!!!
```
That is, we have an inconsistency between the 2 objects (because due to the deepcopy, they are no longer the same). This is MOST NOTABLY an issue when we create the mask, where we use `get_text_config` to know which attn to use, but then we will use the one based on the model's internal config. By pure luck, sdpa can actually use an eager mask as torch supports both format, so it's not an issue with our defaults. It would be with other `attn_implementation` though, if trying to set it explicitly!!!

Comments:
The docs for this PR live [here](https://moon-ci-docs.huggingface.co/docs/transformers/pr_39423). All of your documentation changes will be reflected on that endpoint. The docs are available until 30 days after the last update.

**[For maintainers]** Suggested jobs to run (before merge)

run-slow: altclip, bart, bigbird_pegasus, blenderbot, blenderbot_small, blip_2, chinese_clip, clipseg, dpt, gpt_bigcode, idefics, marian, mbart, mt5, mvp, plbart