Simply? A scalable require();
When your app runs, it requires additional code, often packaged as "services" (See the "app/Services" folder) to get things done.
"Service Providers" are Laravel's way of packaging and managing the code needed to load these additional "services" (or running other code) at app bootup.
They are run in 2 phases - "register", and "boot"; each one defined by a same-named method on the provider.
The list of service providers for your app is listed in config/app.php, and this is how you specify which ones will run, and in what order (you don't need to run all of the service providers in the services folder, you can just keep them there, doing nothing).
When Laravel boots, it looks at the list, loads the right Providers, which in turn have their register() and boot() methods called at the right time.
Then the rest of the app boots, and subsequent tasks which need access to any "services" loaded by the "service providers", have them.
I was frustrated at how "codey" it all seemed at the start, but now I'm used to it, it's not a bad way to do things.