Not allowed to PUT edits to the same entity in the same editgroup. If you want
to update an edit, need to delete the old one first.

The state depends only on the current entity state, not any redirect. This
means that if the target of a redirect is delted, the redirecting entity is
still "redirect", not "deleted".

Redirects-to-redirects are not allowed; this is enforced when the editgroup is
accepted, to prevent race conditions.

Redirects to "work-in-progress" (WIP) rows are disallowed at update time (and
not re-checked at accept time).

"ident table" parameters are ignored for entity updates. This is so clients can
simply re-use object instantiations.

The "state" parameter of an entity body is used as a flag when deciding whether
to do non-normal updates (eg, redirect or undelete, as opposed to inserting a
new revision).

In the API, if you, eg, expand=files on a redirected release, you will get
files that point to the *target* release entity. If you use the /files endpoint
(instead of expand), you will get the files pointing to the redirected entity
(which probably need updating!). Also, if you expand=files on the target
entity, you *won't* get the files pointing to the redirected release. A
high-level merge process might make these changes at the same time? Or at least
tag at edit review time. A sweeper task can look for and auto-correct such
redirects after some delay period.

=> it would not be too hard to update get_release_files to check for such
   redirects; could be handled by request flag?

`prev_rev` is naively set to the most-recent previous state. If the curent
state was deleted or a redirect, it is set to null.

This parameter is not checked/enforced at edit accept time (but could be, and
maybe introduce `prev_redirect`, for race detection). Or, could have ident
point to most-recent edit, and have edits point to prev, for firmer control.