fn widen(a: WgslType, b: WgslType) -> WgslType
Pick the “widest” of two types — vec wins over scalar; among vecs keep the larger; on conflict default to the first non-unknown.