Replaced RuntimeErrors with properly namespaced exceptions

As for now, gem throws generic RuntimeErrors with custom messages, which makes it not very pleasant to handle exceptions.

This PR replaces them with subclassed exceptions, so it becomes easier to fine tune rescue statements, like `rescue GeoIp::InvalidIpError`.