Track variable substitutions in Core clause patterns

This allows the compiler to properly track aliases and avoids some crash related
to match context reusing as in the following code:

t(Bin1) ->
    case Bin1 of
        <<>> -> ok;
        Bin2 ->
            case Bin1 of
                <<0>> -> ok;
                _ -> Bin2
            end
    end.