Location: add type-level distinction of valid locations

This commit introduces Location.Valid and limits common operations (such as change, distance) to this class. All Locations can be validated() or assumeValid()'ed to Location.Valid, but those method will throw (Exception and RuntimeException subclasses respectively) on invalid Locations.

Validation of locations if pushed as far up as reasonable in the current structure of the code. There appear to be quite some places where validity of locations is just assumed, at least we now do so explicitly.

Additional to do:
* add more unit tests to cover new functionality, including parsing behaviour
* check for Location.Valid.isValid() and remove occurences