Make the hashtable adaptable with respect to size.

Each time the internal array becomes full, double the size.

To take a cleaner appraoch, creating a new hashtable with increased size
and copying the data from the old hashtable to it. Resetting the old
pointer to the new one. However, this is still leading to a memory leak.