When compiling alternative syntax blocks, such as `for ...: endfor`,
`if ...: endif` etc., the compiler didn't assign the contained statements
to a dedicated lexical scope, which caused a stack mismatch between
compiler and vm when such blocks declaring local variables weren't
actually executed.

-- Expect stdout --
2
-- End --

-- Testcase --
{%
	if (false):
		let a = 1;
	endif;

	/* Due to lack of own lexical scope above, the compiler assumed
	 * that `a` is still on stack but the code to initialize it was
	 * never executed, so stack offsets were shifted by one from here
	 * on throughout the rest of the program. */

	let b = 2;

	print(b, "\n");
%}
-- End --


Test a variation of the bug using `for in..endfor` loop syntax.

-- Expect stdout --
2
-- End --

-- Testcase --
{%
	for (let x in []):
		let a = 1;
	endfor;

	let b = 2;

	print(b, "\n");
%}
-- End --


Test a variation of the bug using `for..endfor` count loop syntax.

-- Expect stdout --
2
-- End --

-- Testcase --
{%
	for (let i = 0; i < 0; i++):
		let a = 1;
	endfor;

	let b = 2;

	print(b, "\n");
%}
-- End --


Test a variation of the bug using `while..endwhile` loop syntax.

-- Expect stdout --
2
-- End --

-- Testcase --
{%
	while (false):
		let a = 1;
	endwhile;

	let b = 2;

	print(b, "\n");
%}
-- End --