This adds support for the end_lnum and end_col fields to the treesitter
and markdown backends. Now all backends store both the start and the end
of a symbol. At the moment this is only being used for detecting exact
position matching, so the lualine component and highlighting when
`highlight_closest = false`.
This change also made the C, C++, and Julia treesitter backends a bit
more correct and robust.
Side note: this unfortunately moves the symbol location forward in the
line to where the name starts, where before it was at the beginning of
the return type. Every time you add a pointer to the return type (e.g.
int* fn() or int** fn()) it creates a new treesitter wrapper node of
"pointer_declaration". Unfortunately there does not seem to currently be
a way to write a query for function_definition -> <any number for
children> -> function_declaration. Because of that, we must either
explicitly query for each level of pointer indirection, or just query
directly for the function_declaration. I have opted for the latter
because it is cleaner, but it has the side effect of changing the symbol
location slightly.