Redmine#5624: readcsv(): new function with acceptance test

see https://dev.cfengine.com/issues/5624

Simple function to properly parse a CSV file into a data container.  Does appropriate CSV parsing, especially escaped quotes.
Ugliness.  Assignments in conditionals are harder to read.  There is a valid case for them in loop conditions and in intermediate `else if` conditions (or chained-|| or chained-&& conditions) but there is no such win here, as compared to the vastly clearer:
```
FILE *fin = safe_fopen(filename, "r");
if (fin == NULL)
```