Two reasons: 1. There is no ideal implementation of DTM which will fit all possible needs and be efficient for all clusters. 2. Even if such implementation exists, still the right way of it integration is Postgres should use kind of TM API.
I've got to say that this is somewhat reminicient of the discussions around in-core pooling, where argument 1 is applied to justify excluding pooling from core/contrib.
I don't have a strong position on whether a DTM should be in core or not as I haven't done enough work in the area. I do think it's interesting to strongly require that a DTM be in core while we also reject things like pooling that are needed by a large proportion of users.