Add asynchronous Zotero.Utilities.Internal.md5Async()

Also switch ZU.Internal.md5() to use the same binary->hex conversion
code, since I can no longer reproduce the problem I was having with it
before.
Disable send() method in Q promise for Mozilla Task.jsm compatibility

Task.jsm allows not only generators but also iterators to be yielded,
using ``typeof yielded == 'Function'`` as the test for an iterator, but
since the Q promise includes a send() method, yielding a Q promise
instead of a Mozilla promise results in an infinite loop. To fix this,
we disable Q's send() method, which is just an outdated synonym for
invoke() anyway.

This will have to be done every time we update Q until send() is
removed, Task.jsm is changed, or we stop using Task.jsm with Q promises.
Add Zotero.platformVersion and Zotero.platformMajorVersion

platformVersion is a string that needs to be checked with
nsIVersionComparator. platformMajorVersion is an integer that can be
checked with > and < when the major Gecko version is enough.
Add Zotero.Item.libraryKey, to return libraryID and key ("0/ABCD2345")
Evaluate test.js as JS 1.8 in Firefox 17
Better debugging info for library errors
Separate out Zotero.Item._updateAttachmentStates()
Remove unused argument in Z.Sync.Storage.Mode.prototype.cacheCredentials
Add mode name to credentials-cached debug message
Perform sync file modification checks off the main thread in Firefox 23+

OS.File doesn't seem to work reliably before Firefox 23, so older
versions will continue to do mod time checking on the main thread.

Zotero.Sync.Storage.checkForUpdatedFiles() now returns a promise.