refactor($parse): separate tokenizing vs parsing more

Fixes `a.b` and `a .b` generating different getterFns (which was mentioned a while back in https://github.com/angular/angular.js/pull/8901#commitcomment-7691290)
Fixes `{'': ...}` being converted to `{"''": ...}`
Fixes #9131 (similar to how #9229 fixes it)

Also simplifies (imo) a few areas in parse.js. For example...
* tokens no longer have any `fn` (which had 2 meanings before)
* token `text` is always the token text (previously it was the raw value for strings/numbers)
* `.consume()` is used in a few more places instead of `.expect()` and will output a "Unexpected end of expression" instead of `.expect()` returning false and failing later
* the tokenizer no longer tries to figure out if a ".identifier" is a method invocation or not, that's now in the parser and much shorter
should this be more strict? i.e.
```js
if (token.constant) {
  keys.push(token.value);
} else if (token.identifier) {
  keys.push(token.text);
} else {
  throw ...
}
```