[RFC] Nim package structure (library author point-of-view)
This is a follow-up to #6700.

Discussion has been split between #7250 that deals with importing syntax and the end user point of view and this thread for library author point of view.

Reposting my last comment from #7250

------
Something that was touched upon in #6700 but is missing here [in #7250] is how to deal with submodules.

From an user point of view, `import foo/submodule` is great and working. From a dev point of view I don't see how I can respect nimble structure with a `src/` dir, keep meaningful directory names and not trigger the warning when a package grows like Arraymancer:

```
├── src
│   ├── arraymancer.nim
│   ├── autograd
│   │   ├── ag_accessors.nim
│   │   ├── ag_data_structure.nim
│   │   ├── autograd.nim
│   │   ├── gates_basic.nim
│   │   ├── gates_blas.nim
│   │   └── gates_reduce.nim
│   ├── datasets
│   │   └── mnist.nim
│   ├── io
│   │   └── io_csv.nim
│   ├── linear_algebra
│   │   ├── least_squares.nim
│   │   └── linear_algebra.nim
│   ├── math_ops_fusion
│   │   └── math_ops_fusion.nim
│   ├── ml
│   │   ├── metrics
│   │   │   ├── accuracy_score.nim
│   │   │   └── common_error_functions.nim
│   │   └── ml.nim
│   ├── nn
│   │   ├── activation
│   │   │   ├── relu.nim
│   │   │   └── sigmoid.nim
│   │   ├── layers
│   │   │   ├── conv2D.nim
│   │   │   ├── linear.nim
│   │   │   └── maxpool2D.nim
│   │   ├── loss
│   │   │   ├── cross_entropy_losses.nim
│   │   │   ├── loss.nim
│   │   │   └── mean_square_error_loss.nim
│   │   ├── nn.nim
│   │   ├── optimizers
│   │   │   └── optimizers.nim
│   │   └── shapeshifting
│   │       └── reshape_flatten.nim
│   ├── nn_primitives
│   │   ├── backend
│   │   │   ├── ...
│   │   │   └── nnpack_interface.nim
│   │   ├── fallback
│   │   │   └── conv.nim
│   │   ├── nn_primitives.nim
│   │   ├── nnp_activation.nim
│   │   ├── ...
│   │   └── private
│   │       ├── p_activation.nim
│   │       ├── p_logsumexp.nim
│   │       ├── p_nnp_checks.nim
│   │       └── p_nnp_types.nim
│   ├── object_pool
│   │   └── object_pool.nim
│   ├── private
│   │   ├── ...
│   └── tensor
│       ├── ...
│       ...
```

I get
```Nim
Error: Package 'arraymancer' has an incorrect structure. It should contain a single directory hierarchy for source files, named 'arraymancer', but file 'maxpool2D.nim' is in a directory named 'nn/layers' instead. This will be an error in the future.
      Hint: If 'nn/layers' contains source files for building 'arraymancer', rename it to 'arraymancer'. Otherwise, prevent its installation by adding `skipDirs = @["nn/layers"]` to the .nimble file.
```

Same thing for `ag_accessors`. Basically if you use the `srcDir = 'src'` option, it seems like nimble wants each directory to only have a single file with the same name as the directory. This forces putting everything in a `private` directory or having deep nesting.