Support adding a basic timeout to requests

- If the timeout is trigger req.abort() is called.
- Also had to add an extra listener to ensure that the standard callback
  is called even if the connection ends in an error.
merge