Handle port collisions when creating Akka systems

This requires us to handle exceptions thrown more carefully, because
akka throws its own exceptions that are not java.net.BindException.
We workaround this by traversing the Exception causality tree to find
a java.net.BindException with an "Address already in use" message.
Executors connect to wrong port when collision occurs

This commit fixes this by setting "spark.driver.port" to the actual
port the akka system bound to. Note that we already do this for port
0, where the original port is not the same as the bound port. However,
we still face the same issue if we end up using port n + 1.