Simplify troubleshooting by reporting on node calls on failure

This change collects information about each node invocation and wraps
any exception during node invocation in a GraphExecutionException with
the additional data.
The input should be ```@Nullable``` because that's the contract of Function.apply(), but we don't in fact accept nulls - I've added a suppression of the warning about possible nulls, as it can't happen in practice.