garray: add unit tests

Only append_ga_line() was not tested because it relies on global vim state.
garray: refactor ga_grow

- xrealloc will call xmalloc if the input pointer is NULL, no need to check
  twice.
- use the early-quit idiom to decrease the indentation, which enhances
  readability.
memory: implement xstp(n)cpy

Both are implemented to POSIX 2008 spec, though I'm not sure I'm happy about
stpncpy's behaviour.
garray: reimplement ga_concat_strings with stpcpy

Less useless strlen(), stpcpy() is a more natural fit for this task.
ga_concat_strings() still has too much strlen() but that would be ugly to
remove for a function that's not used very often (just once in the current
codebase).
garray: implement ga_concat_strings_sep

A generalized version of ga_concat_strings that can handle any separator.
Reimplement ga_concat_strings on top of it.
garray: add unit tests for ga_concat_strings_sep
garray: make parameter of ga_concat_strings const
garray: refactor and optimize ga_concat

I've checked all uses of ga_concat in the codebase:

- ex_cmds2.c
- ex_getln.c
- eval.c
- message.c
- regexp-nfa.c
- term.c
- spell.c

None of them concats the garray with itself. This makes it safe to use the
faster memcpy() instead of memmove(). This change was also documented.
garray: comment and refactor a bit more

The following functions are affected:

- ga_remove_duplicate_strings
- ga_append