more node-like implementation

Changed a number of things to be more node-like:
- `throw` is not usually a great idea
- options defaulting can be much easier
- `require` can be used even if with the `.js` extension, so you don't need to strip it
- once you hit a return, the `else` is unnecessary
- use `filter` for array