Execute a function call.
(exec-function fun args env limit) → evalue+denv
We look up the function in the environment. We build an initial variable and constant scope with the function's parameters and arguments, and we put that into a call frame, which we push onto the environment's call stack. We execute the body of the function, ensuring it returns a value with the function's output type; we return that value, after popping the frame.