In a large bowl, combine the breadcrumbs, grated cheese and parsley. Use a microplane grater to finely grate in the garlic and onion.
Add the milk and eggs, then mix with a fork until totally combined.
Add the meat and mix with a fork or your hands until the breadcrumb mixture is evenly distributed and the mixture is homogeneous. Be careful not to overmix or it will cause the meatballs to become tough.
Wet your hands form the meat into very small meatballs, about 2 teaspoons each in size, rolling them between your palms to make a sphere. Set aside.
Heat olive oil in a large Dutch oven or soup pot over medium heat. Cook the carrots, celery and onion until soft, about 8 minutes.
Add the chicken stock and bay leaves and bring up to a rolling boil.
Add the meatballs to the soup carefully, then reduce the meat to medium-low and simmer for 5 minutes.
Stir in the escarole until wilted, then cover and cook for an additional 5-10 minutes.
While the soup is cooking, place another pot of water on the stove and bring up to a boil. Cook the pasta via package directions until al dente, then drain and mix with a little bit of olive oil to prevent it from sticking together.
Taste the soup for seasoning and add more salt and pepper if needed.
Place a little bit of pasta in each bowl then ladle the soup over top.
Serve with extra grated cheese and crusty bread for passing.
