Currently DefaultApplicationStartup.start returns a new DefaultStartupStep instance on each call. I think the reason is to detect if end() has been called so that IllegalArgumentExceptions can be thrown. I wonder if we can drop those exceptions for the default implementation and return a single static instance to save object allocations?