promotion: symmetrize promotion rules recursively with promote_type.

If `promote_rule(T,S)` and `promote_rule(S,T)` disagree, call `promote_type` again on the results to get a single common answer. This can resolve cases where there is a conflict between two such rules, making the promotion system a bit more robust.