Re-factoring to use list_node_init()
Checking if sent null ptr for self in list functions
Returning null for data if list is empty when popping
Returning null ptr on error when pushing, otherwise ptr to self

Note the interface did not change. There is a return value now, check it
for NULL if you please.
Re-factoring to use handle_error for perror/exit (anti)pattern