remove target_client from the linked list, client
/*
 * Remove target_client from the given clients and free the memory.
 * Return the fd of the client if it was removed successfully. 
 * Return 0 otherwise.  
 */
int remove_client(Client *target_client, Client **clients){
    Client *curr_client = *clients;

    // return 0 if the list is empty
    if (curr_client == NULL){
        return 0;
    }

    // find and remove target_client from the list, if it exists 
    if (curr_client == target_client){ 
        *clients = curr_client->next_client;
    }
    else{
        // find client with next client equal to the target_client
        while (curr_client->next_client != NULL && curr_client->next_client != target_client){
            curr_client = curr_client->next_client;
        }

        // return 0 if target_client doesn't exist in the list
        if (curr_client->next_client == NULL){
            return 0;
        }
        
        // remove the target_client
        curr_client->next_client = curr_client->next_client->next_client;
    }
    
    // free the memory and return the fd
    int client_fd = target_client->fd;
    free(target_client->username);
    free(target_client);
    return client_fd;
}