Fix service loader returned implementation may not be castable

I found an issue with the service loader implementation. The service loader is not guaranteed to return a service implementation that is compatible with the requested service interface.

At work I was getting a ClassCastException during the tests. In our tests we use a classloader to provide isolation. This classloader does not delegate everything to the parent, I added a test case to cover this.

I added a check that the object returned by the service loader can be cast to the requested class. I removed the use of the method findHighestReachableClassLoader which was causing the wrong classloader to be used.

The findHighestReachableClassLoader method was introduced in [#2279](https://github.com/hazelcast/hazelcast/pull/2279), not clear what case it was trying to solve.
I guess we eventually need to come up with multiple (maybe special) classloading strategies for different environments. The method was introduced to work around a bug where multiple classloaders were able to load the same resource / class. Not 100% sure of the environment anymore that caused it but as mentioned above I guess it was the Play! framework, so removing it will cause a regression bug to occur.