Rename Operation to Function

This rename is in preparation for the unification of the existing
Function interface with the Unary/BinaryFunction hierarchy.

In the updated terminology, a "function" is an "op" that maps N inputs
to a single output. A UnaryFunction maps 1 input to 1 output, and a
BinaryFunction maps 2 inputs to 1 output.
Remove unused BijectiveFunction interface
First cut at standardizing INPUT and OUTPUT typing

We now use I for input type, and O for output type, wherever feasible.
Function: make compute method return output value

This brings the interface into sync with UnaryFunction, in
preparation for unification of these interface hierarchies.
Rename Function to AgnosticUnaryOutputFunction

Really, what was previously called "Function" is actually a unary
function that knows how to agnostically create output object templates
without knowledge of the specific input values.
Standardize createOutput method names

Previously, some classes had createEmptyOutput while others
had createOutput, though it was really all the same concept.
Organize imports
Make AgnosticUnaryOutputFunction a UnaryOutputFunction

This change also introduces an AbstractAgnosticUnaryOutputFunction, and
makes all concrete implementations of AgnosticUnaryOutputFunction extend
it (either directly or indirectly), to ensure all methods in the
contract are properly implemented in a DRY way.
Make a common Function interface

This change makes both UnaryFunction and BinaryFunction extend Function.
UnaryFunction, BinaryFunction: tweak javadoc
Add some abstract superclasses for functions

It is extremely useful to mirror an interface hierarchy with an abstract
superclass hierarchy where possible (i.e., according to some typical
single inheritance pattern). Doing so makes it much easier to change the
interface contracts later without the changes rippling into every single
implementing class, because common methods can be added at the abstract
superclass level and automatically inherited by all concrete extensions.
Add AgnosticOutputFunction interface
Extend AbstractBinaryOutputFunction as appropriate
Remove needless @inheritDoc javadoc tags

The @inheritDoc tag is useful for recapitulating the same javadoc from a
supertype. But its main purpose is to allow additional javadoc to be
prepended or appended to the previous javadoc. Specifying @inheritDoc
with nothing else is redundant, because types and members already
inherit the javadoc from their supertypes by default.