Checkpoint work on tests for deoptimizing large switch statements
Add a basic implementation of switch deoptimization as an AST transform.
Eliminate temporaries at the beginning and end of the code generation pass instead of just the beginning, to catch any stray temporaries.
Add a test for issue #45
If a method used as a delegate is an ignored method, always emit it inline since it will be impossible to construct a delegate for it otherwise, as suggested in issue #37
Rework handling of comparison operators and trycast/checktype to fix issue #46
Remove left-over else clause from issue #37
When generating the variable initialization for ref/out parameters, always do it inside the containing function's scope instead of the current block scope. This prevents the initialization from being erroneously introduced inside a loop or conditional. Fixes issue #44.
Merge branch 'master' of github.com:kevingadd/JSIL into deoptimize-switches

Conflicts:
	Tests/Tests.csproj
Improvements to fix for issue #39:
Overhaul how JSLabelGroupStatements work so that the switch deoptimizer can be simpler.
Eliminate stray gotos after deoptimizing switches.
Perform a pass over the AST after the switch statement deoptimization pass that eliminates any null statements, empty block statements, or label groups with a single label in them.
Perform a second, more thorough loop optimization pass after the switch statement optimization pass is complete. This makes it possible to correctly optimize loops that contain switch statements.
No longer flag goto expressions and ignored member references as null expressions.
Fix the ToString method for loop blocks
Expand test coverage for switch statements.
If the last statement in a loop is a continue statement for that loop, eliminate it.
Fix GetExpectedType for ignored member references
Reuse a single VisitorCache instance per JSAstVisitor type to avoid having to construct the cache every time a visitor is constructed.
Update the bootstrap implementation of Thread to use externals. Should fix issue #43.
If a switch statement has cases that don't do anything except jump directly to the default case, eliminate them and then clean up the stray gotos that were left behind. Fixes issue #47.
Ensure that JSSwitchCase nodes cannot be created with an empty values array.
Add test from issue #55
Instead of identifying loops for targeted break/continue with labels, use separate numeric indices
Eliminate numeric indices from loops that are not targeted by break or continue statements
Build label groups in a transform pass after a function is translated instead of building them during the translation process
Don't emit an unnecessary break at the end of switch cases that end with control flow (break/continue)
Generate better synthetic labels for blocks
Make all loop blocks derive from a common base class and remove the IsLoop property since it's not needed anymore
Fix the switch statement deoptimizer's handling of exit gotos
Add RepeatIterator test case from issue #34.
Fix label group builder hoisting label bodies out without leaving a goto to replace them, and add a test that detects it. Sadly, this can only be detected by analyzing output JavaScript - the IL that encounters this bug cannot be produced by the 'goto' construct in C#, only by the C# compiler. Related to issue #34.
Fix stray gotos being left behind after a switch statement is deoptimized.
Make untranslatable gotos throw when encountered instead of spitting out a warning.
Switch ILSpy into deferred module read mode to reduce memory usage.
Use a ConcurrentCache in the AssemblyResolver.
Fix problems with FunctionAnalysis2ndPass.IsPure. Treat re-entrant invocations as impure to avoid infinite recursion, and cache purity information after the first time it's calculated.
Minor fixes for degenerate code.
Don't recurse into functions pointed to by JSLambda nodes during tree traversal.