Skip unreachable blocks in IRBuilder::reoptimize()

Summary: Unreachable blocks may contain instructions with inconsistent operand
types, but such blocks may not be eliminated until reoptimize turns
conditional jumps into unconditional ones.  So we need to make
reoptimize work in such scenarios, and this diff accomplishes this by
keeping track of which blocks are reachable during reoptimize, and
then skipping the unreachable ones.

I was able to repro this with the new test case, but I had to hack the
profile-based ArrayGet specialization to stress test it.  So I'm
adding a runtime option to for that.

Reviewed By: @jdelong, @alexmalyshev

Differential Revision: D1680327