Split JoinFunction interface from implementation
JoinFunctions: tweak javadoc
Size: add missing javadoc
Rename JoinInplace to JoinInplaces

Not totally happy with that name, but it is more consistent with
"JoinFunctions" (both are explicitly plural now).

This rename also makes room for a new interface called "JoinInplace" to
match the "JoinFunction" interface.
JoinInplaces: tweak javadoc and style
Split JoinInplace interface from implementation
Add Join base interface, and use it where relevant
Rename JoinFunctions and JoinInplaces

They are now called FunctionJoiner and InplaceFunctionJoiner,
respectively, and they no longer declare themselves as "join" ops.

The reason is that they are not really well-formed ops: you have to
manually pass in the functions to be joined, or else the op does not
behave as expected. So we should not expose this function joining code
at the op discovery level. (Ideally they would not even be Ops at all,
but rather only helper classes, but it is useful for them to implement
the Function interface, so the compromise is OK here.)

Since they are *not* valid "join" ops, let's rename them, both for
clarity (to avoid confusion with the JoinFunction and JoinInplace base
interfaces) and to convey that they are helper classes.
JoinInplaceAndInplace: tweak javadoc
DefaultLoopFunction: tweak javadoc
Rename FunctionJoiner to DefaultFunctionJoiner

This change is to differentiate it from a forthcoming FunctionJoiner
base interface.
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
Merge branch 'cleanup-join'

This branch improves the imagej.ops.join class hierarchy.