rework Run/Attach interface

* stdin/stdout/stderr are done via io.Readers/io.WriteClosers, rather than
  everything going over one channel
* Env is now a simple []string, just to be a bit more like exec.Cmd, which
  also tries to be a OS-agnostic interface, despite K=V being 'Unixy'
* the attach/run API calls are now hijacked HTTP connections, so that stdin
  may be sent across the wire later
* rather than consuming the full stream until a payload with an ExitStatus is
  detected, the caller can call process.Wait() to block until it exits, which
  will return you its exit status.
* an 'error' field has been added to ProcessPayload to signify .Wait() failing
  server-side. this will bubble up to the client, which will return an error
  on its respective .Wait().