Fixing out of memory errors during CSV data import


I have tried to import one CSV data file about 1GB into a VoltDB cluster with 2 nodes both having 16GB RAM and got out of memory errors.

After examining the details of CSV import process, I found that when the CSV data is not very clear (such as many duplicate records) and may cause many failures (such as CONSTRAINT VIOLATION). The failed queue used to hold individual rows for insertion will be soon fully filled too many requests that consume too much memory on the machine. 

This PR is intended to fix this problem. I also noticed that invalid rows are kept in memory until data insertion is done and then are flushed in to a file on disk. It also consumes too much memory space when there are too many invalid rows. So this PR makes modification on that behavior to progressively flush invalid rows into file.

The main thread needs to make sure that all error info is written to file before it calls `produceFiles()`, otherwise `m_errorCount` may have incorrect value in the log file.

One way to do that is to queue an empty `ErrorInfoItem` onto `m_errorInfo` after closing the `csvClient`, so that the `ErrorInfoFlushProcessor` thread can stop once it reaches this item. The main thread can then join the thread before calling `produceFiles`. This will guarantee that all errors are written to the file and `m_errorCount` is correct.