Fix for Razor #84 - Optimize GetSourceLocation

GetSourceLocation is frequently called to determine the location mappings
between the original document and the generated code.

The old implementation did a number of ToString and replace operations to
simplify the math on tracking the position - which put it front and center
in our performance measurements - about 25% of all execution time in a
sampling profile of our perf test.

The new code tracks position as code is written, and avoids allocations.
After these changes GetSourceLocation doesn't show up in the profile.
I wanted to preserve the old behavior that `Write(null)` can trigger an indent. I found that this method is definitely called with `null`, and it broadens the scope of this change to investigate wither or not the indent side-effect is important.