implement user-defined fn/op

because BigMPI uses a user-defined datatype, it needs to have
user-defined reduction operations for all of the built-in ones.
unfortunately, this has to be done in an O(N) fashion, but thanks to
preprocessor magic, it isn't so bad.

MPI_IN_PLACE is probably not going to work and {MAX,MIN}LOC need more
work and are not supported yet.

this code is completely untested.