Adding Function and FunctionTask extending RunnableTask functionality

Function allows passing arguments and having a return value in contrast to Runnable,
where FunctionTask allows a Function to be invoked and waited for.
Fix FunctionTask's run()/eval(..) return value assignment: Ensure it's done before syncObject.notifyAll() ; Make methods final

Fixes commit b387d012103a02eb7d5eb919306583295ef09a38.