Extensible named types in Fir

The front-end AST types are one of the most important types in a language implementation, and if we get them wrong nothing will be right in the rest of the implementation. These types should be cheap to allocate and efficient to use, but also extensible, as different tools will use them differently. A type checker may want to add inferred types to expressions, but for a formatter, those inferred…