Fix swipe action with target element: #3647

@Jonahss @imurchie (this reviewers of the first merge request that I closed because the new changes are a lot different) 

*  The original scope of this change was adding the ability to specify a destination element when doing a swipe.  Those are the changes you'll see in the server JS.
*  I added a bunch of tests.
*  When I started expanding the test suite for Android, I uncovered some nasty bugs w relative coordinates.  At least one was caused by copy/pasting.  I then discovered similar code (not nec buggy, but using the same patterns) in multiple places in the project.  I consolidated the logic to decrease the likelihood of bugs and ensure that absolute coordinates were all derived in the same way.
*  There's a bunch of spaghetti code.  If you have any suggestions on how I can get rid of it, lmk.
*  There's a change to the sample code that goes along with this.
*  I ran all the Android `touch` tests and they passed, with the exception of 'should work like `longPress` when released after a pause', which also failed for me before the refactoring


Yeah, the globals make a huge difference in execution time. It takes
3x as long without them--over a min.

On 10/31/14, Jonah <notifications@github.com> wrote:
>> -        .then(function (el) {
>> -          var action = new TouchAction(driver);
>> -          action.press({el: el}).moveTo({x: 0, y: -400
>> }).release().perform();
>> -        })
>> -        .sleep(3000)
>> -        .elementByName("Views").should.eventually.exist
>> -        .nodeify(done);
>> -    });
>> +  it('should be possible with press/moveTo/release and element as
>> target', function (done) {
>> +    var x = 0, y = 0, hOffset;
>> +    var contentElPos = { x: 0, y: 0 }
>> +      , animationElPos = { x: 0, y: 0 }
>> +      , delta = { x: 0, y: 0 };
>> +    driver
>> +      .elementByName("Content")
>> +      .then(function (el) { contentEl = el; return contentEl; })
>
> oh I see, it's setting a global var.
>
> ---
> Reply to this email directly or view it on GitHub:
> https://github.com/appium/appium/pull/3943/files#r19697308