Refactored publishing/unpublishing logic

This cuts out lots of duplicated code.

It also standardises the way we control page state from scripts:

Save a page:
```python
page.save_revision(user=user)
```

Submit for moderation:
```python
page.save_revision(user=user, submitted_for_moderation=True)
```

Publish latest revision of page:
```python
page.get_latest_revision().publish()
```

Create new revision and publish that:
```python
page.save_revision(user=user).publish()
```

Unpublish a page:
```python
page.unpublish()
```

Approve revision in moderation:
```python
revision = page.save_revision(user=user, submitted_for_moderation=True)

revision.approve_moderation() # Will publish the revision
```

All of the above (except for the unpublishing and moderation approval/rejection) one have been available in Wagtail for quite some time now. This PR makes wagtailadmin and scheduled publishing use these methods.

It also moves all the signal firing code into these methods so they now only get fired from one place.