Improve Design of DataModule
🚀 Feature

Motivation
Since the introduction of datamodules we have duplicated code. For example, the train/val/test_dataloader methods in LightningModule and DataModule have the same name, same docs, same signature but live in two files.
Also the argparse methods are copy pasted from Trainer, it will become impossible to maintain this in the future.
Pitch
Factor out the hook definitions:
class DataHooks:

    def prepare_data(...):
    """ docs... """

    def setup(...):
    """ docs... """

    def train_dataloader(...):
    """ docs... """

    etc.
and then in the other classes, inherit from it:
class LightningModule(..., ModelHooks, DataHooks, ...)
    ...

class DataModule(..., DataHooks, ...)
    ...
Note also:

we even have duplicated tests

Alternatives
I see no alternatives. This is the best way I know.
@PyTorchLightning/core-contributors makes sense?