Idiomatic way to require local modules

I’m new to lua and nvim. I have done a plugin for nvim with lua. It consist of three lua modules and a lua file that interacts with vim. I included such local modules using the following

package.path = "./?.lua;" .. package.path;
local foo = require("foo");

From a lua point of view it worked, but once I moved them into its nvim place, nvim/after/syntax/lang/, such require fails (it seems it loads the working directory nvim was called with).
I just changed the path to ~/.config/nvim/after/syntax/lang/?.lua but I guess that’s not the proper way to do this. What’s the idiomatic way to solve this?

I’ve also now written a few lua plugins and from looking at prior art it seems like a good structure is like this:

my_plugin/
    README.md
    LICENSE
    lua/
        my_plugin.lua
        stuff_it_needs/
            submodule1.lua
            submodule2.lua
    doc/
         my_plugin.txt

Then the package managers like pckr.nvim will work fine, or you can dump the top-level my_plugin into ‘packpath’. Inside the submodules, you can have:

local SubModule1 = {}
...
return SubModule1

and in the my_plugin.lua:

local MyPlugin = {}
local submodule1 = require("stuff_it_needs.submodule1")
...
return MyPlugin

Bonus points for implementing a MyPlugin.setup().