simplify value_stack handling in interpreter
simplify value_stack handling in interpreter

The previous algorithm manually handled the value_stack for every
operation, which is error-prone. This algorithm is much simpler; we mark
the location of the value stack whenever we shift an expression, and we
reset the stack to that location after the expression is reduced,
adjusting it by one if it returns a value.

This also properly handles non-local control flow, which will type-check
in any expression but won't push a value.

citisolo/wabt,WebAssembly/wabt,citisolo/wabt,WebAssembly/sexpr-wasm-prototype,WebAssembly/wabt,citisolo/wabt,WebAssembly/sexpr-wasm-prototype,citisolo/wabt,citisolo/wabt,citisolo/wabt,WebAssembly/wabt,WebAssembly/wabt,WebAssembly/wabt,WebAssembly/sexpr-wasm-prototype,WebAssembly/sexpr-wasm-prototype,WebAssembly/sexpr-wasm-prototype,WebAssembly/sexpr-wasm-prototype