Builds a combining fn out of the supplied operator and identity constructor. op must be associative and ctor called with no args must return an identity value for it.