A value of type Backend represents one of GHC's back ends.
The set of back ends cannot be extended except by modifying the
definition of Backend in this module.
The Backend type is abstract; that is, its value constructors are
not exported. It's crucial that they not be exported, because a
value of type Backend carries only the back end's name, not its
behavior or properties. If Backend were not abstract, then code
elsewhere in the compiler could depend directly on the name, not on
the semantics, which would make it challenging to create a new back end.
Because Backend is abstract, all the obligations of a new back
end are enumerated in this module, in the form of functions that
take Backend as an argument.
The issue of abstraction is discussed at great length in #20927 and !7442.