Simplify SplitStringAsItemList().

Instead of using snprintf() to insert a character in a string, set the
string up sensibly in the first place so that we can simply copy the
character into the right place in it.  Instead of memset()ing 4k
in hopes that a failing sscanf won't touch the destination buffer,
actually check sscanf's return.
Potential nightmare-fix in DeleteItem().

When searching a list for the entry whose ->next is the one we're
about to delete, we'd stop on the last item, which doesn't have the
given entry as ->next (it has NULL).  We would then assume that, as it
(as opposed to its ->next) is non-NULL, we should hang our item's
->next off it, where it never did belong.  If the item we're deleting
had our supposed list head somewhere down->next of it, this could have
created a cycle.  So let the loop variable fall off the end of the
loop as NULL and do at least assert that a non-NULL alleged
predecessor has the node to be deleted as its ->next, before fixing
that.
Purge code for unused backup file name.

While there may be some sense in backing up a file before over-writing
it, and computing the name for that file would be useful if we did, we
don't.  So don't bother cooking up an unused name.
Log() on error when reading an item list.
Document what ListsCompare really tests (approximating equality).
Eliminate ByteSizeList in favour of ItemListSize.

Both computed the sum of lengths of strings in a list.  The sole
difference is that the latter checks for, and skips, NULL entries, on
which the former would crash.  Code outside core uses the latter, only
code inside core uses the former, so this change is self-contained to
core (easier to git administer).

Also make ItemList2CSV() robust against NULL entries, now that it's
delegating size computation to ItemListSize().