VASM: remove useless instructions

Summary: This diff implements dead code elimination over VASM. Instructions
that modify cpu flags, physical registers, memory, or control flow,
are considered "useful"; this is conservative but correct when we aren't doing
dataflow analysis on machine state (registers, flags, memory).

A current limitation is that we don't track liveness of status flags, so we
cannot remove otherwise-dead ALU instructions (in case the flags are used).

Runs DCE before register allocation.

Reviewed By: @jasone

Differential Revision: D1460512