Add proof-of-concept compile time code generator

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Generate sources even in Eclipse, but only with a full build

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Generate the sources into target/generated-sources/from-template/

It is much better not to conflate generated sources with non-generated
sources. We employ the 'add-sources' goal of the build-helper plugin.

For Eclipse, happily, m2e already has support for imitating the workings
of the build-helper plugin. The support is on the m2e marketplace;
during the import of the Maven project, m2e will suggest to install it.
If it was imported previously, right-clicking on the error message will
suggest to install it, too.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Split code generation script into its own file

This keeps the POM easier to understand, while providing the actual code
generation logic within the project itself.
Remove trailing slashes from directory properties

Maven does not typically include the trailing slash in properties that
configure a directory path. So let's not do that here either.
Move the template files into src/main/templates/

Suggested by Curtis Rueden.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Merge pull request #2 from imagej/generated-sources

Add proof-of-concept compile time code generator
Remove unused OpInfo struct

I thought it would be needed for op matching, but it never was.
Remove unused FunctionTask class

Thanks to the miracle of SCM tools, we can resurrect it later if needed.
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.