Allow asynchronous calling of Oasis.connect()

Because promises are resolved asynchronously, we need to ensure that
starting a sandbox's underlying port happens after the Oasis.connect
promise is resolved.

This is accomplished by registering another `.then` on the promise
returned by `Oasis.connect` that starts the port. For future readers,
we are relying on the fact that `port.start()` waits to start pumping
buffered events until the end of the current microtask. This ensures
that the other promise handler has an opportunity to set up listeners
on the port before any buffered events are processed.

If this assumption becomes untrue in a future browser, this code will
need to be revisited. However, this will likely result from a change
in the specification or a browser bug.