Keep track of the tail in the list

That list was pretty bad. Still working on this one, but the gist of it is that we store the tail node separately from the head node instead of iterating through all of them to the find the last one. That way, we can keep updating tail->next to add to the list