Dictionary Validation

This is also probably not complete. More questions incoming...
I might be the outcast on this opinion, but local type aliases really irk me as a code smell that something else is wrong. 

It is not a huge deal, but I think when we feel the need to do it (I do it as well) we should ask why and is there a better name somewhere else or a deeper concept to expose. One thing I can see is that ResultT[IO, _] is pretty burdensome, and maybe we should expose `type RIO[A] = ResultT[IO, A]` in mundane which is a closer match for how we think about it. And there might be a case for a `type RIOValidation[A, B] = RIO[Validation[NonEmptyList[A], B]]` so that the return types might become: `RIOValidation[DictError, FilePath]`

I guess what I want to avoid is that there is a bunch of code which should be fairly consistent but isn't because of different type aliases. And I also don't want to have to dig into type aliases every time I want to change a type parameter - which inevitable leads to a cross product of type aliases for each little variant.

@raronson Might have an opinion that disagrees with mine though, because (I think) he finds them useful to clean things up as well. So I will leave it with me stirring things up a bit, just to make sure that everyone agrees enough with it.