fix($compile): Detect when a directive `compile` removes `tElement`

Delect when a directive `compile` function removes `tElement` and keep on with the compilation from the following node

Closes #9198
Will update the patch at some time tomorrow with proper comments and clear logic. Anyhow, I will answer a few of the issues raised

> Another thing, we seem to be optimizing for a bizarre case where we actually do call tElement.detach() in compile, and it's not clear that there's ever a good reason to do this

Agree, it is not clear if we should even care about this case at all, and that is a discussion that is in dependent of the solution


Now, if this is something we want to fix then there are two solutions
* Loop thru all the nodes, capture all the directives and then apply them (that is a refactor that is too big for anybody to feel comfortable)
* Mark the nodes so we know the ones that should be processed **in this loop**


The use of simple boolean values using  `ngHasBeenProcessed` or `ngNotProcessedYet` is no good. The reason being that we need to process only the nodes that originally came to this loop and not elements that can show up later (think or a directive has `replace: true` and `terminal: true`)