Address [#50], [#52] - NB distinguish between JVM and non-JVM locales

The need to strictly enforce valid JVM Locales really only makes sense for
the (JVM) localization utils. The translation fns can be more lenient, using
their normal fallback mechanism when given an invalid locale.

Also in this commit:
  * Switched from `Exception`s to `ex-info`s.
  * Ring middleware improvements, mostly allowed by new distinguish between
    JVM and non-JVM locales.
  * General housekeeping.
Address [#42]: allow `_`s in dictionary key names
Add `loc-tree` unit tests
v3.0.0
Merge branch 'dev'