Optimize node re-execution on function redefinition

1. Memoize the graphnodes in a list that contain user-defined function
calls
2. Refer to the graphnode list when selecting nodes to re-execute
3. Function redefinition test cases for overloaded functions