JIT support
Initial issue description below
JIT support requires several changes in the Trainer and LightningModule:

 No use of python properties like the current dataloader implementation

Possible solution: Use getters like implemented in #275
Other possibility: Handle dataloading completely in trainer. The user is able to modify the dataloaders e.g. every epoch using hooks/callbacks


 The trainer cannot set PLModule's class members afterwards like self.model.trainer = self

This is because after converting my_pl_module = torch.jit.script(my_pl_module), the module has the class ScriptModule. Adding members only adds the members to the ScriptModule not to the underlying LightningModule.
Solution could be: Implement setter in LightningModule. These methods will be transfered to the ScriptModule


 Saving and restoring might need some changes, too. One could conditionally check the class of the provided module in the trainer for use of torch.jit.save in trainer_io
  JIT is currently not compatible with distributed training (see pytorch issue #15421)

Is your feature request related to a problem? Please describe.
The current implementation of pl.LightningModule does not support pytorch's JIT. This is due to the use of python properties for the dataloaders, which is currently not supported in JIT (see here).
example trace:
$ python train.py
VISIBLE GPUS:
Traceback (most recent call last):
  File "train.py", line 69, in <module>
    train(config, data_dir)
  File "train.py", line 37, in train
    trainer.fit(pl_module)
  File "/home/schroeter/.virtualenvs/pytorch-1.2/lib/python3.7/site-packages/pytorch_lightning/trainer/trainer.py", line 694, in fit
    self.__run_pretrain_routine(model)
  File "/home/schroeter/.virtualenvs/pytorch-1.2/lib/python3.7/site-packages/pytorch_lightning/trainer/trainer.py", line 879, in __run_pretrain_routine
    self.get_dataloaders(ref_model)
  File "/home/schroeter/.virtualenvs/pytorch-1.2/lib/python3.7/site-packages/pytorch_lightning/trainer/trainer.py", line 574, in get_dataloaders
    self.train_dataloader = model.train_dataloader
  File "/home/schroeter/.virtualenvs/pytorch-1.2/lib/python3.7/site-packages/torch/jit/__init__.py", line 1563, in __getattr__
    return super(ScriptModule, self).__getattr__(attr)
  File "/home/schroeter/.virtualenvs/pytorch-1.2/lib/python3.7/site-packages/torch/nn/modules/module.py", line 589, in __getattr__
    type(self).__name__, name))
AttributeError: 'ScriptModule' object has no attribute 'train_dataloader'
where pl_module has:
class PlModule(pl.LightningModule):
# ....
    @pl.data_loader
    def train_dataloader(self):
        return self.__dataloader("train")
Describe the solution you'd like
torch.jit.script(pl_module)
Describe alternatives you've considered
A workaround might be defining a separate Module handling all nn.Module stuff and transforming only this part into a jit script module.
A solution might be to define explicit getters like get_train_dataloader(self) instead of using properties.