Play's runtime dependency injection support is built on JSR-330, which provides a specification for declaring how
dependencies get wired to components. JSR-330 however does not address how components are provided to or located
by a DI container. Play's API seeks to address this in a DI container agnostic way.

The reason for providing this abstraction is so that Play, the modules it provides, and third party modules can all
express their bindings in a way that is not specific to any one DI container.

Components are bound in the DI container. Each binding is identified by a BindingKey, which is
typically an interface that the component implements, and may be optionally qualified by a JSR-330 qualifier
annotation. A binding key is bound to a BindingTarget, which describes how the implementation
of the interface that the binding key represents is constructed or provided. Bindings may also be scoped using
JSR-330 scope annotations.

Loads an application. This is responsible for instantiating an application given a context.

Application loaders are expected to instantiate all parts of an application, wiring everything together. They may
be manually implemented, if compile time wiring is preferred, or core/third party implementations may be used, for
example that provide a runtime dependency injection framework.

During dev mode, an ApplicationLoader will be instantiated once, and called once, each time the application is
reloaded. In prod mode, the ApplicationLoader will be instantiated and called once when the application is started.

Out of the box Play provides a Guice module that defines a Java and Scala default implementation based on Guice,
as well as various helpers like GuiceApplicationBuilder. This can be used simply by adding the "PlayImport.guice"
dependency in build.sbt.

A custom application loader can be configured using the play.application.loader configuration property.
Implementations must define a no-arg constructor.

A default marker context. This is used by MarkerContext.apply, but can also be used to provide
explicit typing for markers. For example, to define a SecurityContext marker, you can define a case
object extending DefaultMarkerContext: