Improving type inference by removing Dynamic checks

Using a trick from Jason O'Neil to enforce different types of objects. The only downside is that it requires `AcceptEither` to be declared every time the type parameters differ (`String`/`Int`, `String`/`Array<String>`, etc...).

Overall this should improve compile time type checking.