Java DSL: Introduce `FunctionExpression`

Add support for `FunctionExpression` and apply it alongside with `expression`, where it is possible
For example:
```
.enrich(e -> e.requestChannel("enrichChannel")
		.requestPayload(Message::getPayload)
		.shouldClonePayload(false)
		.<Map<String, String>>headerFunction("foo", m -> m.getPayload().get("name")))
```
Remove redundant functional interfaces in favor of `Function`
See `Expression.getValueType()` JavaDocs:
```
/**
 * Returns the most general type that can be passed to the {@link #setValue(EvaluationContext, Object)}
 * method using the default context.
 * @param rootObject the root object against which to evaluate the expression
 * @return the most general type of value that can be set on this context
 * @throws EvaluationException if there is a problem determining the type
 */
```
From other side we can't extract the generic type of `Function`, if it is a Lambda. See here: https://github.com/spring-projects/spring-integration-extensions/wiki/Spring-Integration-Java-DSL-Reference#serviceActivators:
> Since Java doesn't support generic type rosultion for Lambda classes...