Fix #2529: explicit protection package

https://issues.dlang.org/show_bug.cgi?id=2529

This does not implement original proposal from linked bugzilla entry but addresses same goal.

Currently there is no way to use `package` protection attribute with deeply nested package hierarchy, forcing to either use flat one or `public` protection. This is one of blocking issues for further usage of `package.d` in Phobos and one of reasons why namespace hacks are so popular.

For example, if helpers in `std.internal` will be marked as `package`, only `std.internal` will be able to access those, but not rest of `std`. This PR fixes it by allowing `package(<pkgname>)` syntax to explicitly define owning package.

This new syntax will work:

```D
module std.internal.mod1;
package(std) void foo() {}
```

```D
module std.mod2;
import std.internal.mod2;
void bar() { foo(); }
```

Exact semantics can are described by added "protection" tests to `test/compilable` (last commit in this PR).

Plain `package` behavior is unchanged and thus no breaking changes introduced.
This reads funny as a binary relation.

```
x.isSubpackage(y);
```

I would read that as "is x a subpackage of y?" It took me a while to figure it out, and I only understood it by reading the document comment in the end. I would rename the function to something like ```isAncestorPacakgeOf`` or similar.

That's literally the only thing wrong I found with this diff.