Krun options

**please review**

* use JCommander for krun
* clean up krun frontend to be more generic
* fix some hacky behavior in some of the options
This is an unreachable code. Maybe we should use same pattern for every unreachable cases in the code base. I just searched in the code base for "unreachable" and saw these patterns used:

```java
throw e; //unreachable
return null; // unreachable code
throw new AssertionError("unreachable");
```

At least adding a comment or changing the string argument so that a reader can know this is supposed to be unreachable would be nice.

Best option would be using exhaustive pattern matching like in typed functional languages but I don't know how to do that in Java or if it's even possible.