git_version wasn't expecting a version number that contained letters, LOL

My whacked-out installed git from DTurner's mad science lab has version "number" 1.9.1.598.g9119e8b .
git_version's regexp wasn't expecting letters mixed in there.
So this test was crashing, trying to call None.group(2)

I changed the behavior: get the part of the version that looks like
dotted numbers. Get the 1.9.1.598, drop the letter-y part.

Testing Done:
Now the test doesn't crash.

(The test fails for me running DTurner's mad science git.
DTurner knows and is saying things that make me think he
knows what's going on, yay)

Reviewed at https://rbcommons.com/s/twitter/r/456/
Run python tests under goal.

This introduces a new task to run python tests.

It leaves the old-pants test running intact, so
there's no change for existing users.
Fix a mismatch in the expected and actual module names in ivy resolution.
Implement new plugin to implement callables that need to create targets

Testing Done:
https://travis-ci.org/pantsbuild/pants/builds/26734850

Local testing done too:

[tw-172-25-20-142 pants]$ head examples/BUILD
make_lib(org='com.twitter', name="test", rev="1.0")
[tw-172-25-20-142 pants]$

[tw-172-25-20-142 pants]$ git diff
diff --git a/src/python/pants/backend/core/register.py b/src/python/pants/backend/core/register.py
index 1539ca1..468d35c 100644
--- a/src/python/pants/backend/core/register.py
+++ b/src/python/pants/backend/core/register.py
@@ -61,8 +61,9 @@ def partial_path_relative_util_aliases():

 def callable_build_file_functions():
-  return {}
-
+  return {
+    'make_lib': make_lib,
+  }

 # aliases
 def target_aliases():
@@ -175,3 +176,29 @@ def register_goals():

   goal(name='roots', action=ListRoots
   ).install('roots').with_description("Print the workspace's source roots and associated target types.")
+
+
+def make_lib(alias_map, org, name, rev, alias=None, sources=True, excludes=None):
+  """A helper method to create jar libraries.
+  """
+
+  dep = alias_map['jar'](org=org, name=name, rev=rev)
+  if sources:
+    dep.with_sources()
+  if excludes:
+    for exclude in maybe_list(excludes, Exclude):
+      dep.exclude(org=exclude.org, name=exclude.name)
+  lib = alias_map['jar_library'](name=name, jars=[dep])
+  if alias:
+    alias_map['jar_library'](name=alias, jars=[lib])
+  return lib

[tw-172-25-20-142 pants]$ PANTS_DEV=1 ./pants goal list examples/BUILD::
*** Running pants in dev mode from /Users/tdesai/projects/pants/src/python/pants/bin/pants_exe.py ***
Loading pants backends from source
examples/BUILD:test
[tw-172-25-20-142 pants]$

Bugs closed: 185

Reviewed at https://rbcommons.com/s/twitter/r/452/