Control modification in CRuby.

Behavior of control modification keywords on blocks.

All take an argument, nil by default.

[next] soft return from the block, the blocks return value
       is the argument to next.

[break] hard return from the method that called the block.
        the methods return value is the argument to break.

[redo] the ip is reset to the start of the block and execution is continued.

[retry] the ip is reset to the start of the method calling
        the block and the method is completely rerun, including
        reimporting the arguments into locals.

I question the fact that the argument reimporting code is run
on a retry. You can't have a bare retry in a method, only
inside a block will it work. That being true, I also question
retry in a block that influences the calling method directly
in the first place.

The one good aspect of having some behavior for retry is that
it can't be used as the retry for a begin/rescue/end. This
means that all the conditional modifiers never exit, at most
the sending context of a block. This means that conditional
modifiers can be optimized directly into bytecode gotos.

Exceptions to this rule in CRuby.
Proc: no retry available. Because Proc's are created by calling
proc() or Proc.new with a block, returning INTO proc() or Proc.new
makes no sense.

Thread: all control mods just exit the thread.

---

For while and until.

[next] return to the top of the conditional.
[break] jump to just after the whiles body.
[redo] return to the top of the while, after the conditional though.
[retry] NOT ALLOWED

No mods for if, unless, and case.

For the body of a begin:
[next, redo, retry] NA
[break] jump to just beyond the end of the begin.

Inside a rescue:
[next, break, redo] NA
[retry] Jump back to the top of the begin.

Inside an ensure/else:
[next, break, redo, retry] NA

