Grunt

this addresses #18

I have been thinking about updating the travis setup to use grunt, that way the travis build will fail when jshint doesn't pass. Thoughts?

jshint has found a few issues with `rewrite.js`, think we either need fix the issues or change the jshint config to allow things we want.

```
Running "jshint:lib" (jshint) task

   lib/rewrite.js
     56 |  if (pattern == null && node != null) {
                       ^ Use '===' to compare with 'null'.
     56 |  if (pattern == null && node != null) {
                                       ^ Use '!==' to compare with 'null'.
     60 |  if (pattern != null && node == null) {
                       ^ Use '!==' to compare with 'null'.
     60 |  if (pattern != null && node == null) {
                                       ^ Use '===' to compare with 'null'.
     64 |  if (wildcards != null && isWildcard(pattern)) {
                         ^ Use '!==' to compare with 'null'.
     87 |      && match(wildcards, pattern.value, node.value);
               ^ Bad line breaking before '&&'.
     93 |      && match(wildcards, pattern.property, node.property);
               ^ Bad line breaking before '&&'.
    103 |      && match(wildcards, pattern.right, node.right);
               ^ Bad line breaking before '&&'.
    106 |      && match(wildcards, pattern.test, node.test)
               ^ Bad line breaking before '&&'.
    107 |      && match(wildcards, pattern.update, node.update)
               ^ Bad line breaking before '&&'.
    108 |      && match(wildcards, pattern.body, node.body);
               ^ Bad line breaking before '&&'.
    170 |      && match(wildcards, pattern.init, node.init);
               ^ Bad line breaking before '&&'.
    194 |      if (wildcards != null && isWildcard(replacement)) {
                             ^ Use '!==' to compare with 'null'.
    207 |      for (var i = 0; i < replacement.elements.length; i++) {
                          ^ 'i' is already defined.
    217 |      for (var i = 0; i < replacement.arguments.length; i++) {
                          ^ 'i' is already defined.
    223 |      for (var i = 0; i < replacement.params.length; i++) {
                          ^ 'i' is already defined.
    226 |      for (var i = 0; i < replacement.defaults.length; i++) {
                          ^ 'i' is already defined.
    233 |      for (var i = 0; i < replacement.params.length; i++) {
                          ^ 'i' is already defined.
    236 |      for (var i = 0; i < replacement.defaults.length; i++) {
                          ^ 'i' is already defined.
    250 |      for (var i = 0; i < replacement.declarations.length; i++) {
                          ^ 'i' is already defined.
    273 |      for (var i = 0; i < replacement.properties.length; i++) {
                          ^ 'i' is already defined.
    310 |}
          ^ Missing semicolon.
    327 |      })
                 ^ Missing semicolon.
    331 |}
          ^ Missing semicolon.

>> 24 errors in 6 files
```