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` handles the exception case.