analyze audio files

* added ids.js to bower and build scripts
* create simple factory and service for analyzing tags using id3

TODO
* add in uploads module methods to use id3 service to analyze selected audio files.
My typical approach on things where there is a set of expectations on the resolution of a promise is to copy it out of the callback scope and then run expectations after a `$rs.$apply()`.

The primary reason is that, as written here, anything which causes the promise to no longer resolve will allow the tests to remain silent - the expectations will never be defined (as the callback will never be run).

Something like:

```javascript
var result;

AnalyzeAudio.analyze({name: 'test.mp2', type: null}).then(function (data) { result = data; });
$rs.$apply();

expect(result.tags.album).toEqual("mister bar");
```

protects against this possibility.

Alternatively, you can get most of the same protections by using the expectation I added as part of ngHalMocks:

```javascript
var promise = AnalyzeAudio.analyze(mockFile).then(function (file) {
  ...
});

expect(promise).toResolve();
```

If you have a fairly simple value you are expecting to resolve to (or if you're dealing with an ngHal document, which allows you to traverse the object directly from the promise with `#get()` and `#call()`), you can also use the `#toResolveTo()` expectation.