Create less IO errors to improve efficiency of require (forwardport of #8189)

In some environment (especially when coffescript is involved) module.js
will spend a lot of time looking up nonexisting files. This is caused by the
lengthy error creation. Those errors are then immediately caught.

This change makes the lookup much faster, by avoiding the unnecessary error
creation.

module::statPath now uses the new second parameter of fs.statSync function of the
fs.js. There is a similar change for the fs.stat, adding the third parameter.

This is the forwardport of https://github.com/joyent/node/pull/8189
Node is doing this wrong. We should be synchronously throwing if no callback is passed to an asynchronous function. e.g.
```javascript
try {
  fs.stat('/not/here');
} catch(e) {
  // This won't be reached, so we have an
  // uncatchable error.
}
```
The above demonstrates horrible API design. We know immediately if there's a callback or not, and we should let the user know that as well.

Honestly I don't care if there's some strange backwards compatibility reason for this. It needs to change.