feat(sauceprovider): append spec filename to capabilities.name
refactor(protractor): reorganize internal structure of elementFinder/webelement

 - Allow chaining of actions (i.e. element(By.x).clear().sendKeys('abc))
 - first(), last(), and get(index) are not executed immediately, allowing
     them to be placed in page objects
 - Rework the way that elementFinder and wrappedWebElement is represented
 - Breaking changes:
   - element.all is chained differently
       Before: element(By.x).element.all(By.y)
       Now:    element(By.x).all(By.y)
     However, using element.all without chaining did not change,
       i.e. element.all(By.x)
   - Changed the way for retrieving underlying webElements
       Before: element(By.x).find(), element(By.x).findElement(By.y),
                 and element(By.x).findElements(By.y)
       Now:    element(By.x).getWebElement(),
                 element(By.x).element(By.y).getWebElement(),
                 and element(By.x).element(By.y).getWebElements(),
                 respectively
   - browser.findElement returns a raw WebElement so $, $$, and
       evaluate will no longer be available
test(selenium): add a mock driver provider for integration testing

With `mockSelenium: true` in the config, an instance of WebDriver using a
fake executor will be used. This executor returns a successful test response
for any command, and never connects to a real browser.