Overhaul TF serving signatures + dummy inputs
Right now, our default TF serving signature is only really appropriate for BERT-like models, which means it needs to be overridden in most cases. This PR does inspection of `self.call` to figure out what to actually use, but can still be overridden if required. It also moves the definition of the serving signature to the `__init__()`, which allows it to use values from the `config` to set parts of the shape (e.g. `num_channels`)

I might also explore doing something similar with `dummy_inputs` in this PR and build models via the serving signature, without needing to explicitly define `dummy_inputs`. Ideally, we could eliminate a lot of that boilerplate, which would make it much easier for users to contribute models and reduce the amount of work needed to turn a LLM translation from PyTorch into a working TF model.
_The documentation is not available anymore as the PR was closed or merged._<|||||>This should be ready to review now - it shouldn't affect any existing models, as all our existing models override `serving`, `serving_output` and `dummy_inputs`. However, it should hopefully be a default that "just works" for a lot of future models, and means we can stop specifying the same information in three different places.<|||||>@gante Agreed! I can make that cleanup part of this PR, WDYT?<|||||>@Rocketknight1 Sounds good!<|||||>@Rocketknight1 plz ping when this PR is ready for a re-review 🔥 <|||||>@gante @amyeroberts This should be ready for re-review now, but no rush because it's late on a Friday! The core idea is that I collapsed all of the redundant information we had down to a single source of truth. That source of truth is a new property on our models: `input_signature`. **All** serving methods and decorators have been removed from our models - serving on all models is now set in the `__init__` with 
`self.serving = tf.function(self.eager_serving, input_signature=[self.input_signature]`.

This fixes a major problem we had: As well as being a huge source of repetitive boilerplate, the serving signatures were incorrect in several places, and because they were compiled with a decorator, the decorator could not access `self.config`, which meant the serving signature could not include shape constraints that are defined in the config (such as `config.image_size`). This meant we just used `None` dimensions for dimensions that were actually not variable!

Additionally, `dummy_inputs` is now inferred from `self.input_signature` as well. Specifically, the `dummy_inputs` property fills in `None` dimensions in the `input_signature` with `2` and then just generates tensors with that shape and dtype, then builds the model with those.

`dummy_inputs` can still be overridden, and this is used in a few models when they need particular dummy inputs to build without errors. The vast majority of `dummy_inputs` have been removed, though. `serving` can in theory be overridden too, but there was no need to do this in any of our models.

Finally, the new base `serving_output` code covers most cases, and I'd estimate about 75% of `serving_outputs` in the codebase are gone. I expect there are going to be a few issues, but I'll keep an eye on the tests and make sure it's all okay!<|||||>It seems like there's a few issues caused by the default dummy input values triggering assertions or issues - I'll add dummy_inputs overrides to those models.<|||||>@gante @amyeroberts I think everything should pass now - ready for final review!<|||||>This PR reduces the size of our TF codebase (files matching `*_tf_*.py`) by a little under 5%, lol