Refactor request handling for XHR, JSONP and image beacons

* XHR now attempts to use `MSXML2.XMLHTTP.3.0`, `MSXML2.XMLHTTP`, or `Microsoft.XMLHTTP` objects if `XMLHttpRequest` is not supported
* XHR, JSONP and image beacons are all now generally reusable, and may be exposed under utils in a later release, pending some signature (in)decisions for JSONP and beacons
* `uploadEvent` and `sendQuery` functions revert to XHR when URL exceeds `Keen.urlMaxLength`
@dustinlarimer handleFailure here is a bit of a mouthful. As someone reading the code I think I would rather see the use of private functions so that it reads more naturally:

```
var handleFailure = function(res, req){
      var response = JSON.parse(res.responseText);
      self.trigger('error', response);
      if (self.error) {
        self.error(res, req);
      }
      Keen.log(res.statusText + ' (' + response.error_code + '): ' + response.message);
    };

    _each(self.queries, function(query, index){
      var url;
      var successSequencer = function(res){
        handleSuccess(res, index);
      };
      var failureSequencer = function(res){
        handleFailure(res, index);
      };

      if (query instanceof Keen.Query) {
        self.sendQueryParams()
      } else if ( Object.prototype.toString.call(query) === '[object String]' ) {
        self.sendSavedQueries()
      } else {
      	self.logRequestError()
      }
    });
// Private

function sendQuery(params*){
});

function sendSavedQueries(params*){
});

function logRequestError(params*){
});
    

```