Add instantiateAndUpate to reduce number of indirections

Instead of always replacing the redex with an NPointer to the result, we can
replace it with the actual value after an application or evaluating a number.

Still need to use an NPointer when evaluating a let or a variable - the result
maybe not have been computed yet.