BART: move boilerplate code inside encoder/decoder
# 🚀 Feature request

Could we move the boilerplate code in the `BartModel` `forward()` method inside the `forward()` methods for the encoder and decoder? That way, the encoder and decoder can be called separately as independent modules more easily.


## Motivation

Currently, there's some cleanup work that is done before calling `BartEncoder.forward()` and `BartDecoder.forward()` (looks like attention mask flipping and preparing dummy outputs). If we want to call the encoder and decoder separately from our own code (eg to use Bart as an encoder, or limit which parts are fine tuned) we currently have to re-implement this code.

If we move this logic inside the encoder and decoder, such that `BartModel.forward()` is a thin wrapper around the encoder+decoder, this kind of work would be much easier.

Example usage:
```
model = BartModel.from_pretrained(...)
inputs = tokenizer.encode('I want to classify this text.')
encoding = model.encoder(inputs)
predictions = my_classifier(encoding)
```

## Your contribution

I could put together a PR for this if you agree?

(cc @sshleifer )

Sounds good to me