Automate pod arg implementation decision (#575)

Contributes to #529

* Decision made on a per-kernel basis
* New pass assigns metadata to kernels
  * passes use that metadata through new utliities to get the right
  ArgKinds
  * currently only decides based on command line options (so NFC)
* Refactored layout validation into new files
* Refactored some global push constant methods
* new enum for how pod args are implemented
  * kGlobalPushConstant will be implemented in the future
* added new metadata to test that required it
* changed arg kind utility to take the arg instead of just the type
* Priorities per-kernel push constants then ubo then ssbo
  * checks for compatibility
* Added new variant of isValidExplicitLayout that checks the whole
struct
diff --git a/lib/MultiVersionUBOFunctionsPass.cpp b/lib/MultiVersionUBOFunctionsPass.cpp
index 307407d..d67cb29 100644
--- a/lib/MultiVersionUBOFunctionsPass.cpp
+++ b/lib/MultiVersionUBOFunctionsPass.cpp
@@ -133,7 +133,7 @@
 bool MultiVersionUBOFunctionsPass::AnalyzeCall(
     Function *fn, CallInst *user, std::vector<ResourceInfo> *resources) {
   for (auto &arg : fn->args()) {
-    if (clspv::GetArgKindForType(arg.getType()) != clspv::ArgKind::BufferUBO)
+    if (clspv::GetArgKind(arg) != clspv::ArgKind::BufferUBO)
       continue;
 
     Value *arg_operand = user->getOperand(arg.getArgNo());