Handle exception for non existing commands

### Description

If a command `blah` is not found, currently an exception is raised. The exception is raised in the thread and not possible to handle outside.

```
Traceback (most recent call last):
  File "test_envoy.py", line 31, in test_non_existing_command
    r = envoy.run("blah")
  File "/Users/kracekumar/code/envoy/envoy/core.py", line 212, in run
    out, err = cmd.run(data, timeout, kill_timeout, env, cwd)
  File "/Users/kracekumar/code/envoy/envoy/core.py", line 92, in run
    raise self.exc
OSError: [Errno 2] No such file or directory
```

Pull request handles the `OSError` case .

```
In [1]: import envoy

In [2]: vars(envoy.run("blah"))
Out[2]:
{'_process': <envoy.core.Command at 0x113c7d050>,
 'command': ['blah'],
 'history': [],
 'status_code': 127,
 'std_err': u'No such file or directory\nTraceback (most recent call last):\n  File "/Users/kracekumar/code/envoy/envoy/core.py", line 214, in run\n    out, err = cmd.run(data, timeout, kill_timeout, env, cwd)\n  File "/Users/kracekumar/code/envoy/envoy/core.py", line 93, in run\n    raise self.exc\nOSError: [Errno 2] No such file or directory\n',
 'std_out': ''}

```