Add custom TimeoutError

Add `TimeoutError` and make `promise.timeout` use it for rejections by default.  This allows pattern-matching via `catch(Promise.TimeoutError, handleTimeoutError)`.