Optimize memory allocation in removeUnreachable()

Summary: I noticed this function doing a lot of allocation while profiling
the JIT; it was using std::hash_set. Rewrote it to use a bitvector
and vectors; it's O(1) allocations now instead of O(numBlocks).

Reviewed By: @alexmalyshev

Differential Revision: D1495383