Generic view model provider.
fun <VM : ViewModel> Fragment.viewModel(key: String? = null, factory: () -> VM): VM