feature/outer kore

**please review**

outer KORE sketch. will probably change as we start using it.
Think in terms of a language which has inheritance. You cannot do something *to* it, but you can do something *with* it. You can pass it to someone which accepts `ProductionItem`s. Consider the following examples:
```
SyntaxProduction(Terminal("foo"), RegexTerminal("bar"))
```
```
SyntaxProduction(Import("foo"), NonTerminal("bar"))
```
How do you enforce that the first one compiles and the second one doesn't?

(Nothing above is specific to Scala -- it is the same in Java. And no, I don't think it is really the same as type families. Scala abstract types are more akin to type families)