- This is a list of operations instead of a list of old/new PHIDs because of scalability issues for large lists (T13056).
- This is a fairly verbose list (instead of, for example, the more concise internal map we sometimes use with "+" and "-" as keys) to try to make the structure obvious and extensible in the future.
- The "add" and "remove" echo the *.edit operations.
Called transaction.search on an object with project tag changes, saw them in the results.
I guess there's some argument I should call this "tags" instead of "projects", but the *.edit transactions are called "projects", and I think most of the projects/tags confusion we hit historically was around new users figuring things out, not users digging into the API.