Calculate slug positions in the model

Change-Id: I4c5cb277facd29d6a69aac95e5bcff5d56bee89a
Add hasSlugAtOffset to DM document

Change-Id: I3e9930e56c0e4d9978f73bd850f27a23230424e7
Move getRelativeOffset, getRelativeRange, getNearestFocusableNode to model

Bonus: Remove ve.dm.Node.getOuterRange get override which was providing
less functionality than ve.Node.

Change-Id: I76f9476c25a64157165fe24fe889d7b9b1020451
Remove hard coded types from canHaveSlugBefore and fix logic

Move node specific behaviour into nodes:

* TextNode
  - Never slug

* ListNode
  - Slug before, but not after (as double enter lets you insert after)

Change-Id: I20df551d9b1b9c71d1688ba51de9edd9bad75f1c
Merge "Calculate slug positions in the model"
Merge "Add hasSlugAtOffset to DM document"
Merge "Move getRelativeOffset, getRelativeRange, getNearestFocusableNode to model"
Merge "Remove hard coded types from canHaveSlugBefore and fix logic"