Rename FunctionJoiner to DefaultFunctionJoiner

This change is to differentiate it from a forthcoming FunctionJoiner
base interface.
fixup! Add Join base interface, and use it where relevant
Move shared FunctionJoiner code to abstract class

The DefaultFunctionJoiner and InplaceFunctionJoiner shared a lot of
code; let's put it in a common superclass.
Split FunctionJoiner API to an interface