Modify hook on_batch_start() API to support other iterable dataloaders
Motivation
By default  LightningModule.train_dataloader() and etc return a PyTorch DataLoader, but it can be easily extended to other iterable objects by converting to vanilla batch in on_batch_start()
Pitch
def on_batch_start(self, batch):
    # do something
    # before
    return response
    # after
    return batch, response # batch is (Tensor, Tensor)
# example of using torchtext for NMT
@pl.data_loader
def train_dataloader(self):
    return torchtext.data.BucketIterator(dataset, batch_size)

def on_batch_start(self, batch):
    x, y = batch.src, batch.trg
    return (x, y), None
Alternatives
Normally I can do this in forward(), but when using multiple gpus, it's better to let Lightning handle batch transfer.
Additional context

Implementation in my fork https://github.com/chutaklee/pytorch-lightning/commit/b81c0ba1fcc01530f8e66a66f8e522c10826f797
Since it is not backward compatible(for those who've used on_batch_start() in their models), and I haven't make it to tests yet, so I'm not so sure, though it seems like a nice feature.