Update has() to cache results and not repeat tests

I've switched has to an IIFE returning an object with support info. This prevents tests from being repeated as well, ie.
```javascript
if (!has("json")) {
  if (!has("json-stringify")) {
    // ...
  }
  if (!has("json-parse")) {
    // ...
  }
}
```
repeats the json stringify and parse support tests twice each.