[FIX] possibility of select being interrupted, just restart the call

uses EnvironmentError because not sure if socket.error or os.error
[IMP] style

use break instead of return so cleanup can eventually be put after loop if necessary (?)
[FIX] correctly display JS stack frames in phantomjs runner

altered reporting to handle and deserialize JSON if JSON-deserializable. Can't
just send multiple lines as driver currently does not handle multiple lines of
message... Yeah turns out having a JSON-based protocol between phantomjs and
the python runner allowed multiple lines in messages, who'd have thought eh?
[FIX] actually retry select on EINTR

Turns out select has its own select.error which does *not* subclass
EnvironmentError (or OSError or IOError) and does *not* have a .errno
attribute. So use the correct exception, might just work better than using
a completely different one with no relation.