Cook the vegetables: In a large pot, melt the butter over medium heat. Add the onions, carrots, and celery. Cook for 5-7 minutes, until the vegetables soften. Add the garlic and cook for another minute, stirring occasionally.
Make the roux: Sprinkle the flour over the cooked vegetables and stir well to combine. Continue cooking for 1-2 minutes, allowing the flour to cook out, ensuring there is no raw taste.
Add liquids: Gradually pour in the chicken broth, stirring constantly to avoid lumps. Bring the mixture to a boil, then reduce the heat and simmer for 10-15 minutes, allowing the flavors to blend and the soup to thicken.
Add chicken and cream: Stir in the shredded chicken, heavy cream, and milk. Continue to cook for 5-7 minutes, ensuring the soup is heated through. Season with salt and pepper to taste.
Blend (optional): For a smoother texture, you can blend part of the soup using an immersion blender, or blend a small portion in a regular blender and return it to the pot.
Garnish and serve: Ladle the soup into bowls, garnish with chopped parsley (if using), and serve hot.