## What's up with the shady patch functions?
Django currently does not provide a way to extend certain classes that are used when auto-generating migrations using `makemigrations`. The patch functions using Python's standard mocking framework to direct certain functions to a custom implementation.

These patches allow `django-postgres-extra` to let Django auto-generate migrations for `PostgrsPartitionedModel`.

None of the patches fundamentally change how Django work. They let Django do most of the work and only customize for Postgres specific models. All other models are left untouched.

### Using the patches
The patches are all context managers. The top level `postgres_patched_migrations` context manager applies all patches for the duration of the context.

This is used in the custom `pgmakemigrations` command to extend the migration autodetector for `PostgresPartitionedModel`.

### Patches
#### Autodetector patch
* Patches `django.db.migrations.autodetector.MigrationAutodetector.add_operation`

This function is called every time the autodetector adds a new operation. For example, if Django detects a new model, `add_operation` is called with a new `CreateModel` operation instance.

The patch hooks into the `add_operation` function to transform the following operations:

* `Createmodel` into a `PostgresCreatePartitionedModel` operation if the model is a `PostgresPartitionedModel` and adds a `PostgresAddDefaultPartition` operation to create a default partition.

* `DeleteModel` into a `PostgresDeletePartitionedModel` operation if the model is a `PostgresPartitionedModel`.

#### ProjectState patch
* Patches `django.db.migrations.state.ProjectState.from_apps`

This function is called to build up the current migration state from all the installed apps. For each model, a `ModelState` is created.

The patch hooks into the `from_apps` function to transform the following:

* Create `PostgresPartitionedModelState` from the model if the model is a `PostgresPartitionedModel` instance.

`PostgresPartitionedModelState` is needed to track the partitioning options (`PartitioningMeta`) in migrations. Without this, the partitioning options would not end up in the migrations.

Add some technical docs on migrations/ module
Add some technical docs on migrations/ module
