[IR] Bug fix in IRBuilder restoring $!

* With the following ruby snippet, the original exception
  raised in "foo" never reached the top-level because the return
  in foo's rescue handler didn't restore "$!". Discovered that
  IR building wasn't restoring them properly.

* Discovered by running MRI test on test_whileuntil.rb -- the exception
  is still being lost there, so more digging to be done.

---------------
def foo
  raise "test exception 1 in foo"
rescue Exception => e
  return "foo: caught #{e}"
end

def bar
  begin
    raise "test exception 2 in bar"
  ensure
    p foo
  end
end

begin
  bar
rescue Exception => e
  p "top: caught #{e}"
end
---------------