This essentially inlines `__make_tuple_types` and simplifies the support code. This significantly simplifies the implementation, since `__make_tuple_types` has multiple features, but the different places that use it only make use of a subset of the features. Inlining it separates concerns better and leads to less code in total.