ENYO-591: Clean up DataList page assignment logic

We have recently had some issues (e.g. ENYO-575, BHV-18217) that
arose because DataList would sometimes assign invalid (negative)
page indices.

We made point fixes to address these specific issues (including
one fix that we knew was just a quickfix for a deeper issue), but
in the process it became apparent that some general cleanup in this
area would yield more understandable / maintainable code and
probably nip similar issues in the bud.

In this change, we:

* Consolidate page assignment logic, which was formerly done
  partially in refresh() and partially in resetToPosition(), into
  a single new  method, assignPageIndices()

* Incorporate logic originally implemented in Moonstone to be
  smarter about choosing whether to generate the preceding or
  following page along with our target page

* Document page assignment logic thoroughly with inline comments

* Refactor reset(), refresh() and resetToPosition() to be
  independent of one another while sharing common functionality

* Add a new optional argument, scrollerArgs, to scrollToIndex().
  This allows scrollToIndex() to be easily overridden in Moonstone
  (and potentially other libraries) without copying and pasting a lot of code.

Enyo-DCO-1.1-Signed-Off-By: Gray Norton (gray.norton@lge.com)
ENYO-591: Provide simpler mechanism for overriding scrollToControl

Our fix for ENYO-591 introduced an overly complex, awkward method
for subkinds of the DataList delegate to override scrollToControl.

Replacing that with something cleaner and simpler. (Thanks to Ryan
Duffy for the suggestion.)

Enyo-DCO-1.1-Signed-Off-By: Gray Norton (gray.norton@lge.com)
Merge pull request #951 from enyojs/ENYO-591-graynorton

ENYO-591: Clean up DataList page assignment logic

Reviewed-By: Ryan Duffy (ryan.duffy@lge.com)
Integrated-By: Aaron Tam (aaron.tam@lge.com)