Cross-browser getUserMedia shim with a node.js style error-first API