Restructuring Parallel Programs by Transformation of Point-to-Point Interactions into Collective Communication