dynamic arrays: double in size when growth is necessary
- start at 16 entries, and double thereafter
- most, but not all, of our array types always leave space for a trailing NULL
- the point is to avoid allocation overhead by reducing the number of allocations, trading off memory use for speed