Implement formula revisions (WIP)

This is an attempt to address #12190. It is very much a WIP.

Incrementing a formula's revision number prompts an upgrade. This should be done when something happens that necessitates recompilation (or equivalent). The revision is encoded in the keg name (except when `revision == 0`, for compatibility).

The most obvious example of where this is useful is when the library version of a dependency changes. In the last week this happened with icu4c, which broke harfbuzz and pango by association, and resulted in a lot of tickets. If we track revisions, we can just increment the revision number of harfbuzz and avoid this.

It will also be useful for propagating any formula maintenance that is significant enough to warrant a rebuild.

What's implemented is very basic and probably the implementation will change, I'm not in love with the Keg::Version class and I'd rather keep knowledge of revisions away from Keg. I'm toying with the idea of `Formula#version` returning an object that wraps `Formula#active_spec.version` and adds the revision tag.

The details of how this will interact with `devel` are unclear, so I'm just punting on that for the time being. I'm mainly concerned with how it interacts with bottles, which already have their own revision system. I think it *should* work as-is, as long as we can ensure these two requirements:

 (a) when the formula revision is incremented, a new bottle is made with the appropriate changes
 (b) when a bottle is updated, the formula revision is incremented


IOW, (a) we must avoid incrementing the formula revision without rebottling, because we don't want to prompt a from-source upgrade; and (b) we want bottle revisions to be able to prompt upgrades.

This will necessitate some adjustments in the bottle tooling, as the formula revision is encoded in the keg name.

Anyway, I mostly just want a place for discussion, as I said the code is still a WIP.